让代码更简单

C#二值化图像算法

重要:本文最后更新于2018-05-30 11:15:20,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

图像二值化,顾名思义,将图像转换为只有两种值的图像。在将彩色图灰度化后,我们得到了一张RGB值都是同一个值组成的灰度图,现在我们遍历这张图,计算这张图上所有像素的RGB值中任意一个G的和,再除以像素和,得到一个平均值,这个值就是二值化的阈值,大于这个值将这个像素值设为黑色,小于这个值设置为白色,最后就能得到一张由黑白组成的图片,即二值化图像。

下面是C#代码:

复制
/// <summary>
 /// 图像二值化1:取图片的平均灰度作为阈值,低于该值的全都为0,高于该值的全都为255
 /// </summary>
 /// <param name="bmp"></param>
 /// <returns></returns>
 public static Bitmap ConvertTo1Bpp1(Bitmap bmp, String iss)
 {
 int average = 0;
 for (int i = 0; i < bmp.Width; i++)
 {
 for (int j = 0; j < bmp.Height; j++)
 {
 Color color = bmp.GetPixel(i, j);
 average += color.B;
 }
 }
 int averages=0;
 if (iss != "")
 {
 averages = Convert.ToInt32(iss);
 }
 else { 
 averages= (int)average / (bmp.Width * bmp.Height);
 } 
 for (int i = 0; i < bmp.Width; i++)
 {
 for (int j = 0; j < bmp.Height; j++)
 {
 //获取该点的像素的RGB的颜色
 Color color = bmp.GetPixel(i, j);
 int value = 255 - color.B;
 Color newColor = value > averages ? Color.FromArgb(0, 0, 0) : Color.FromArgb(255,
255, 255);
 bmp.SetPixel(i, j, newColor);
 }
 }
 return bmp;
 }

这里我调整了自动取平均值阈值,可以选择手动阈值。

注:平均阈值转换的二值化图像可能严重失真,所以我们大部分情况采用手动阈值。

灰度图:

C#GRB图转灰度图算法

C#GRB图转灰度图算法

二值化图像:

C#二值化图像算法

C#二值化图像算法

感觉很棒!可以赞赏支持我哟~

6 打赏

评论 (1)

登录后评论
直接用for循环的话太慢了 不知道用指针来处理怎么搞
QQ咨询 邮件咨询 狗哥推荐