C#将图片2值化示例代码,原图及二值化后的图片如下:
原图:
二值化后的图像:
实现代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
using
System;
using
System.Drawing;
namespace
BMP2Grey
{
class
Program
{
static
void
ToGrey(Bitmap img1)
{
for
(
int
i = 0; i < img1.Width; i++)
{
for
(
int
j = 0; j < img1.Height; j++)
{
Color pixelColor = img1.GetPixel(i, j);
//计算灰度值
int
grey = (
int
)(0.299 * pixelColor.R + 0.587 * pixelColor.G + 0.114 * pixelColor.B);
Color newColor = Color.FromArgb(grey, grey, grey);
img1.SetPixel(i, j, newColor);
}
}
}
static
void
Thresholding(Bitmap img1)
{
int
[] histogram =
new
int
[256];
int
minGrayValue=255, maxGrayValue=0;
//求取直方图
for
(
int
i = 0; i < img1.Width; i++)
{
for
(
int
j = 0; j < img1.Height; j++)
{
Color pixelColor = img1.GetPixel(i, j);
histogram[pixelColor.R]++;
if
(pixelColor.R > maxGrayValue) maxGrayValue = pixelColor.R;
if
(pixelColor.R < minGrayValue) minGrayValue = pixelColor.R;
}
}
//迭代计算阀值
int
threshold = -1;
int
newThreshold = (minGrayValue + maxGrayValue) / 2;
for
(
int
iterationTimes = 0; threshold != newThreshold && iterationTimes < 100; iterationTimes++)
{
threshold = newThreshold;
int
lP1 =0;
int
lP2 =0;
int
lS1 = 0;
int
lS2 = 0;
//求两个区域的灰度的平均值
for
(
int
i = minGrayValue;i < threshold;i++)
{
lP1 += histogram[i] * i;
lS1 += histogram[i];
}
int
mean1GrayValue = (lP1 / lS1);
for
(
int
i = threshold+1;i < maxGrayValue;i++)
{
lP2 += histogram[i] * i;
lS2 += histogram[i];
}
int
mean2GrayValue = (lP2 / lS2);
newThreshold = (mean1GrayValue + mean2GrayValue) / 2;
}
//计算二值化
for
(
int
i = 0; i < img1.Width; i++)
{
for
(
int
j = 0; j < img1.Height; j++)
{
Color pixelColor = img1.GetPixel(i, j);
if
(pixelColor.R > threshold) img1.SetPixel(i, j, Color.FromArgb(255, 255, 255));
else
img1.SetPixel(i, j, Color.FromArgb(0, 0, 0));
}
}
}
static
void
Main(
string
[] args)
{
try
{
//打开位图文件
Bitmap img1 =
new
Bitmap(
"test.jpg"
,
true
);
//灰度化
ToGrey(img1);
//二值化
Thresholding(img1);
//写回位图文件
img1.Save(
"output.jpg"
);
Console.WriteLine(
"Converted."
);
}
catch
(ArgumentException)
{
Console.WriteLine(
"Invalid usage!"
);
Console.WriteLine(
"Usage: bmp2grey source object"
);
}
}
}
}
|