/// <summary> /// 全局阈值图像二值化 /// </summary> /// <param name="bmp">原始图像</param> /// <param name="method">二值化方法</param> /// <param name="threshold">输出:全局阈值</param> /// <returns>二值化后的图像数组</returns> public static Byte[,] ToBinaryArray(this Bitmap bmp, BinarizationMethods method, out Int32 threshold) { // 位图转换为灰度数组 Byte[,] GrayArray = bmp.ToGrayArray(); // 计算全局阈值 if (method == BinarizationMethods.Otsu) { threshold = OtsuThreshold(GrayArray); } else { threshold = IterativeThreshold(GrayArray); } // 根据阈值进行二值化 Int32 PixelHeight = bmp.Height; Int32 PixelWidth = bmp.Width; Byte[,] BinaryArray = new Byte[PixelHeight, PixelWidth]; for (Int32 i = 0; i < PixelHeight; i++) { for (Int32 j = 0; j < PixelWidth; j++) { BinaryArray[i, j] = Convert.ToByte((GrayArray[i, j] > threshold) ? 255 : 0); } } return(BinaryArray); }
/// <summary> /// 全局阈值图像二值化 /// </summary> /// <param name="bmp">原始图像</param> /// <param name="method">二值化方法</param> /// <param name="threshold">输出:全局阈值</param> /// <returns>二值化图像</returns> public static Bitmap ToBinaryBitmap(this Bitmap bmp, BinarizationMethods method, out Int32 threshold) { // 位图转换为灰度数组 Byte[,] GrayArray = bmp.ToGrayArray(); // 计算全局阈值 if (method == BinarizationMethods.Otsu) { threshold = OtsuThreshold(GrayArray); } else { threshold = IterativeThreshold(GrayArray); } // 将灰度数组转换为二值数据 Int32 PixelHeight = bmp.Height; Int32 PixelWidth = bmp.Width; Int32 Stride = ((PixelWidth + 31) >> 5) << 2; Byte[] Pixels = new Byte[PixelHeight * Stride]; for (Int32 i = 0; i < PixelHeight; i++) { Int32 Base = i * Stride; for (Int32 j = 0; j < PixelWidth; j++) { if (GrayArray[i, j] > threshold) { Pixels[Base + (j >> 3)] |= Convert.ToByte(0x80 >> (j & 0x7)); } } } // 从二值数据中创建黑白图像 Bitmap BinaryBmp = new Bitmap(PixelWidth, PixelHeight, PixelFormat.Format1bppIndexed); // 设置调色表 ColorPalette cp = BinaryBmp.Palette; cp.Entries[0] = Color.Black; // 黑色 cp.Entries[1] = Color.White; // 白色 BinaryBmp.Palette = cp; // 设置位图图像特性 BitmapData BinaryBmpData = BinaryBmp.LockBits(new Rectangle(0, 0, PixelWidth, PixelHeight), ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed); Marshal.Copy(Pixels, 0, BinaryBmpData.Scan0, Pixels.Length); BinaryBmp.UnlockBits(BinaryBmpData); return(BinaryBmp); }
/// <summary> /// 全局阈值图像二值化 /// </summary> /// <param name="bmp">原始图像</param> /// <param name="method">二值化方法</param> /// <param name="threshold">输出:全局阈值</param> /// <returns>二值化后的图像数组</returns> public static Byte[,] ToBinaryArray(this Bitmap bmp, BinarizationMethods method, out Int32 threshold) { // 位图转换为灰度数组 Byte[,] GrayArray = bmp.ToGrayArray(); // 计算全局阈值 if (method == BinarizationMethods.Otsu) threshold = OtsuThreshold(GrayArray); else threshold = IterativeThreshold(GrayArray); // 根据阈值进行二值化 Int32 PixelHeight = bmp.Height; Int32 PixelWidth = bmp.Width; Byte[,] BinaryArray = new Byte[PixelHeight, PixelWidth]; for (Int32 i = 0; i < PixelHeight; i++) { for (Int32 j = 0; j < PixelWidth; j++) { BinaryArray[i, j] = Convert.ToByte((GrayArray[i, j] > threshold) ? 255 : 0); } } return BinaryArray; }
/// <summary> /// 全局阈值图像二值化 /// </summary> /// <param name="bmp">原始图像</param> /// <param name="method">二值化方法</param> /// <param name="threshold">输出:全局阈值</param> /// <returns>二值化图像</returns> public static Bitmap ToBinaryBitmap(this Bitmap bmp, BinarizationMethods method, out Int32 threshold) { // 位图转换为灰度数组 Byte[,] GrayArray = bmp.ToGrayArray(); // 计算全局阈值 if (method == BinarizationMethods.Otsu) threshold = OtsuThreshold(GrayArray); else threshold = IterativeThreshold(GrayArray); // 将灰度数组转换为二值数据 Int32 PixelHeight = bmp.Height; Int32 PixelWidth = bmp.Width; Int32 Stride = ((PixelWidth + 31) >> 5) << 2; Byte[] Pixels = new Byte[PixelHeight * Stride]; for (Int32 i = 0; i < PixelHeight; i++) { Int32 Base = i * Stride; for (Int32 j = 0; j < PixelWidth; j++) { if (GrayArray[i, j] > threshold) { Pixels[Base + (j >> 3)] |= Convert.ToByte(0x80 >> (j & 0x7)); } } } // 从二值数据中创建黑白图像 Bitmap BinaryBmp = new Bitmap(PixelWidth, PixelHeight, PixelFormat.Format1bppIndexed); // 设置调色表 ColorPalette cp = BinaryBmp.Palette; cp.Entries[0] = Color.Black; // 黑色 cp.Entries[1] = Color.White; // 白色 BinaryBmp.Palette = cp; // 设置位图图像特性 BitmapData BinaryBmpData = BinaryBmp.LockBits(new Rectangle(0, 0, PixelWidth, PixelHeight), ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed); Marshal.Copy(Pixels, 0, BinaryBmpData.Scan0, Pixels.Length); BinaryBmp.UnlockBits(BinaryBmpData); return BinaryBmp; }