灰度图像的腐蚀算法和细化算法(C#代码)
- 格式:docx
- 大小:28.91 KB
- 文档页数:7
灰度图像的腐蚀算法和细化算法(C#代码)
最近做一些图像处理,需要将图像中的一些像素过滤一下,有网友给提了个名词:腐蚀算法。我不是学图像学的,乍一听,觉得很神奇。后来从网上收集了一些VC代码,研究了一下,发现其它也就是那么回事。尤其是腐蚀算法,我在以前的验证码图片去噪声的文章中提到过,只是那是我不知叫什么名词,就从用途出发,叫做“根据周边点数去噪”。腐蚀的原理也一样,就是根据当前点的周边点数(如3X3的,周边就有8个点)来修改当前点的状态的。
代码是我从VC代码中转译过来的,注释都沿用了原作者的文字(别说是剽窃,^_^)。唯一改进的地方是,原代码功能只能处理0和255的二值灰度(搞不懂为什么这样,对于250、128这样的都不行,还不如弄成二值灰度,别弄256灰度了),我将之改成了能根据0~255中任意灰度划界的256灰度图像!
以下是C#代码:
1 ///
2
///
该函数用于对图像进行腐蚀运算。结构元素为水平方向或垂直方向的三个点,
3
///
中间点位于原点;或者由用户自己定义3×3的结构元素。
4 ///
5 /// 前后景临界值
6 /// 腐蚀方式:0表示水平方向,1垂直方向,2自定义结构元素。
7 /// 自定义的3×3结构元素
8 public void ErosionPic(int dgGrayValue, int nMode, bool[,] structure)
9 {
10 int lWidth = bmpobj.Width;
11 int lHeight = bmpobj.Height;
12 Bitmap newBmp = new Bitmap(lWidth, lHeight);
13
14 int i, j, n, m; //循环变量
15 Color pixel; //像素颜色值
16
17 if (nMode == 0)
18 {
19 //使用水平方向的结构元素进行腐蚀
20 // 由于使用1×3的结构元素,为防止越界,所以不处理最左边和最右边
21 // 的两列像素
22 for (j = 0; j < lHeight; j++)
23 {
24 for (i = 1; i < lWidth - 1; i++)
25 {
26 //目标图像中的当前点先赋成黑色
27 newBmp.SetPixel(i, j, Color.Black);
28
29 //如果源图像中当前点自身或者左右有一个点不是黑色,
30 //则将目标图像中的当前点赋成白色
31 if (bmpobj.GetPixel(i - 1, j).R > dgGrayValue || 32 bmpobj.GetPixel(i, j).R > dgGrayValue ||
33 bmpobj.GetPixel(i +
1, j).R > dgGrayValue)
34 newBmp.SetPixel(i, j, Color.White);
35 }
36 }
37 }
38
else
if (nMode ==
1)
39 {
40
//使用垂真方向的结构元素进行腐蚀
41 //
由于使用3×1的结构元素,为防止越界,所以不处理最上边和最下边
42 // 的两行像素
43 for (j = 1; j < lHeight - 1; j++)
44 {
45 for (i = 0; i < lWidth; i++)
46 {
47 //目标图像中的当前点先赋成黑色
48 newBmp.SetPixel(i, j, Color.Black);
49
50 //如果源图像中当前点自身或者左右有一个点不是黑色,
51 //则将目标图像中的当前点赋成白色
52 if (bmpobj.GetPixel(i, j - 1).R > dgGrayValue ||
53 bmpobj.GetPixel(i, j).R > dgGrayValue ||
54 bmpobj.GetPixel(i, j + 1).R > dgGrayValue)
55 newBmp.SetPixel(i, j, Color.White);
56 }
57 }
58 }
59 else
60 {
61 if (structure.Length != 9) //检查自定义结构
62 return;
63 //使用自定义的结构元素进行腐蚀
64 // 由于使用3×3的结构元素,为防止越界,所以不处理最左边和最右边
65 // 的两列像素和最上边和最下边的两列像素
66 for (j = 1; j < lHeight - 1; j++)
67 {
68 for (i = 1; i < lWidth - 1; i++)
69 {
70 //目标图像中的当前点先赋成黑色
71 newBmp.SetPixel(i, j, Color.Black);
72 //如果原图像中对应结构元素中为黑色的那些点中有一个不是黑色,
73 //则将目标图像中的当前点赋成白色
74 for (m = 0; m < 3; m++)
75 { 76
for (n =
0; n <
3; n++)
77 {
78
if (!structure[m, n])
79 continue;
80 if (bmpobj.GetPixel(i + m -
1, j + n -
1).R > dgGrayValue)
81 {
82 newBmp.SetPixel(i, j, Color.White);
83
break;
84 }
85 }
86 }
87 }
88 }
89 }
90
91 bmpobj = newBmp;
92 }
93
94
95 ///
96 /// 该函数用于对图像进行细化运算。要求目标图像为灰度图像
97 ///
98 ///
99 public void ThiningPic(int dgGrayValue)
100 {
101 int lWidth = bmpobj.Width;
102 int lHeight = bmpobj.Height;
103 // Bitmap newBmp = new Bitmap(lWidth, lHeight);
104
105 bool bModified; //脏标记
106 int i, j, n, m; //循环变量
107 Color pixel; //像素颜色值
108
109 //四个条件
110 bool bCondition1;
111 bool bCondition2;