版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
二值化的算法主要有以下两种:
1、彩色图像灰度化后,根据灰度和阈值来确定颜色是黑色还是白色。通常情况下使用的阈值是128。
2、第一种算法选择128作为阈值,在实际使用中显示效果并不是很好,可以采用更常见的求阈值的方法,例如大律法等。
【例 17.38】二值化算法一。
//黑白1
private void btn2Color1_Click(object sender, EventArgs e)
{
Color pSourceColor;
Color pDestColor;
Bitmap destImg = new Bitmap(sourceImg.Width, sourceImg.Height);
int R, G, B;
int AvgColor;
for (int i = 0; i < sourceImg.Width; i++)
{
for (int j = 0; j < sourceImg.Height; j++)
{
pSourceColor = sourceImg.GetPixel(i, j);
R = pSourceColor.R;
G = pSourceColor.G;
B = pSourceColor.B;
AvgColor = (R + G + B) / 3;
if (AvgColor >= 128)
AvgColor = 255;
else
AvgColor = 0;
pDestColor = Color.FromArgb(AvgColor, AvgColor, AvgColor);
destImg.SetPixel(i, j, pDestColor);
}
}
picDest.Image = destImg;
}
运行结果如下图所示:
图17-42 二值化处理一
【例 17.39】二值化算法二。
//黑白2
private void btn2Color2_Click(object sender, EventArgs e)
{
Color pSourceColor;
Color pDestColor;
Bitmap destImg = new Bitmap(sourceImg.Width, sourceImg.Height);
int R, G, B;
int[] HistGram = new int[256];
for (int i = 0; i < sourceImg.Width; i++)
{
for (int j = 0; j < sourceImg.Height; j++)
{
pSourceColor = sourceImg.GetPixel(i, j);
HistGram[pSourceColor.R] += 1;
}
}
int threshold;
int allSum = 0;
int allCount=0;
for(int k = 0;k<= 255;k++)
{
allCount += HistGram[k];
allSum += k * HistGram[k];
}
threshold = allSum / allCount;
for (int i = 0; i < sourceImg.Width; i++)
{
for (int j = 0; j < sourceImg.Height; j++)
{
pSourceColor = sourceImg.GetPixel(i, j);
R = pSourceColor.R;
if (R >= threshold)
R = 255;
else
R = 0;
pDestColor = Color.FromArgb(R, R, R);
destImg.SetPixel(i, j, pDestColor);
}
}
picDest.Image = destImg;
}
运行结果如下图所示:
图17-43 二值化处理二
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看 C# 教程 目录