博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Win8 Metro(C#)数字图像处理--2.52图像K均值聚类
阅读量:6217 次
发布时间:2019-06-21

本文共 4692 字,大约阅读时间需要 15 分钟。

原文:



[函数名称]

  图像KMeans聚类      KMeansCluster(WriteableBitmap src,int k)

///         /// KMeans Cluster process.        ///         /// The source image.        /// Cluster threshould, from 2 to 255.        /// 
public static WriteableBitmap KMeansCluster(WriteableBitmap src,int k)KMeansCluster { if (src != null) { int w = src.PixelWidth; int h = src.PixelHeight; WriteableBitmap dstImage = new WriteableBitmap(w, h); byte[] temp = src.PixelBuffer.ToArray(); byte[] tempMask = (byte[])temp.Clone(); int b = 0, g = 0, r = 0; //定义灰度图像信息存储变量 byte[] imageData = new byte[w * h]; //定义聚类均值存储变量(存储每一个聚类的均值) double[] meanCluster = new double[k]; //定义聚类标记变量(标记当前像素属于哪一类) int[] markCluster = new int[w * h]; //定义聚类像素和存储变量(存储每一类像素值之和) double[] sumCluster = new double[k]; //定义聚类像素统计变量(存储每一类像素的数目) int []countCluster = new int[k]; //定义聚类RGB分量存储变量(存储每一类的RGB三分量大小) int[] sumR = new int[k]; int[] sumG = new int[k]; int[] sumB = new int[k]; //临时变量 int sum = 0; //循环控制变量 bool s = true; double[] mJduge = new double[k]; double tempV = 0; int cou = 0; //获取灰度图像信息 for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { b = tempMask[i * 4 + j * w * 4]; g = tempMask[i * 4 + 1 + j * w * 4]; r = tempMask[i * 4 + 2 + j * w * 4]; imageData[i + j * w] = (byte)(b * 0.114 + g * 0.587 + r * 0.299); } } while (s) { sum = 0; //初始化聚类均值 for (int i = 0; i < k; i++) { meanCluster[i] = i * 255.0 / (k - 1); } //计算聚类归属 for (int i = 0; i < imageData.Length; i++) { tempV = Math.Abs((double)imageData[i] - meanCluster[0]); cou = 0; for (int j = 1; j < k; j++) { double t = Math.Abs((double)imageData[i] - meanCluster[j]); if (tempV > t) { tempV = t; cou = j; } } countCluster[cou]++; sumCluster[cou] += (double)imageData[i]; markCluster[i] = cou; } //更新聚类均值 for (int i = 0; i < k; i++) { meanCluster[i] = sumCluster[i] / (double)countCluster[i]; sum += (int)(meanCluster[i] - mJduge[i]); mJduge[i] = meanCluster[i]; } if (sum == 0) { s = false; } } //计算聚类RGB分量 for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { sumB[markCluster[i + j * w]] += tempMask[i * 4 + j * w * 4]; sumG[markCluster[i + j * w]] += tempMask[i * 4 + 1 + j * w * 4]; sumR[markCluster[i + j * w]] += tempMask[i * 4 + 2 + j * w * 4]; } } for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { temp[i * 4 + j * 4 * w] = (byte)(sumB[markCluster[i + j * w]] / countCluster[markCluster[i + j * w]]); temp[i * 4 + 1 + j * 4 * w] = (byte)(sumG[markCluster[i + j * w]] / countCluster[markCluster[i + j * w]]); temp[i * 4 + 2 + j * 4 * w] = (byte)(sumR[markCluster[i + j * w]] / countCluster[markCluster[i + j * w]]); } } Stream sTemp = dstImage.PixelBuffer.AsStream(); sTemp.Seek(0, SeekOrigin.Begin); sTemp.Write(temp, 0, w * 4 * h); return dstImage; } else { return null; } }
你可能感兴趣的文章
Kafka 分布式消息系统
查看>>
spring源码-开篇
查看>>
Python中的魔法方法
查看>>
MIT识物机器人:“秒懂”物体,过目不忘,不用标记数据!
查看>>
【Web API系列教程】3.10 — 实战:处理数据(发布App到Azure App Service)
查看>>
脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
查看>>
【Web Audio API】 — 那些年的 web audio
查看>>
深入理解CAS算法原理
查看>>
构建多页的前后分离web项目(alpaca-spa的视图用法)
查看>>
Ubuntu笔记--文件关联软件
查看>>
2017 年终总结 —— 在路上
查看>>
[20180627]truncate table的另类恢复.txt
查看>>
Android DataBinding数据绑定技术在传统ListView中的使用简例
查看>>
Android - 使用Volley请求网络数据
查看>>
情出所愿 事过无悔
查看>>
java实现office文件预览
查看>>
C# TextBox 焦点
查看>>
TCP协议解析
查看>>
Spark on Yarn 架构解析
查看>>
SqlServer建立存储过程,方便.NET插入自增字段
查看>>