[函数名称]
简单统计法图像二值化 WriteableBitmap StatisticalThSegment(WriteableBitmap src)
/// <summary> /// Statistical method of image segmention. /// </summary> /// <param name="src">The source image.</param> /// <returns></returns> public static WriteableBitmap StatisticalThSegment(WriteableBitmap src) ////Ostu法阈值分割 { 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[] srcData = new int[w * h]; int eX = 0; int eY = 0; int sumEF = 0; int sumE = 0; int eMax = 0; //定义阈值变量 int Th = 0; for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { srcData[i + j * w] = (int)((double)tempMask[i * 4 + j * w * 4] * 0.114 + (double)tempMask[i * 4 + 1 + j * w * 4] * 0.587 + (double)tempMask[i * 4 + 2 + j * w * 4] * 0.299); } } for (int j = 1; j < h - 1; j++) { for (int i = 1; i < w - 1; i++) { eX = srcData[i - 1 + j * w] - srcData[i + 1 + j * w]; eY = srcData[i + (j - 1) * w] - srcData[i + (j + 1) * w]; eMax = Math.Max(eX, eY); sumE += eMax; sumEF += eMax * srcData[i + j * w]; } } Th = (int)(sumEF / sumE); for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { temp[i * 4 + j * w * 4] = temp[i * 4 + 1 + j * w * 4] = temp[i * 4 + 2 + j * w * 4] = (byte)(srcData[i + j * w] < Th ? 0 : 255); } } Stream sTemp = dstImage.PixelBuffer.AsStream(); sTemp.Seek(0, SeekOrigin.Begin); sTemp.Write(temp, 0, w * 4 * h); return dstImage; } else { return null; } }