区域生长法的编程实现程序员数字图像处理第一步.docx
- 文档编号:7874431
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:15
- 大小:281.44KB
区域生长法的编程实现程序员数字图像处理第一步.docx
《区域生长法的编程实现程序员数字图像处理第一步.docx》由会员分享,可在线阅读,更多相关《区域生长法的编程实现程序员数字图像处理第一步.docx(15页珍藏版)》请在冰点文库上搜索。
区域生长法的编程实现程序员数字图像处理第一步
数字图像处理的书数不胜数。
相关的方法,从直方图、卷积到小波、机器学习方面的方法也举不胜举。
OpenCV库给我们提供了一整套图像存储、显示方法外,也集成了很多很多的图像、视频处理算法以及机器学习算法,以函数的形式提供给我们使用。
然而在初学阶段,我们往往过分依赖于OpenCV中的那些库函数。
虽说OpenCV集成了很多高效算法,然而,毕竟不是无所不包。
OpenCV中基础的算法有时会缺失,有时用起来不是很得心应手。
区域生长算法就是一例。
区域生长法,思路很简单:
将一个图像中的一点作为种子,此种子会沿8邻域/4邻域进行扩展,扩展具有一定限制(即差值不能过大,当然你可以引入梯度这个概念,甚至二维偏导数……),求出种子生长的最终结果。
把示例程序的几张结果发过来,何谓区域生长法,大家一看便知。
区域生长法对于较为均衡的背景中提取目标物而言,效果较为理想。
与阈值法、边缘检测法孰优孰劣,俺笔力及精力有限,不进行比较了。
单从工程角度,区域生长法是统计闭合图形个数的基础。
这里自己写了一下这个程序的演示代码,只负责将背景同生长不上去的区域分开:
[cpp] viewplaincopy
1.#define INIT 0
2.#define SEED -1
3.#define CONT -2
4.#define INVAL -3
5.
6.int color_templ[5*6*3]
7.= {
8. 0,0,0, 40,40,40, 80,80,80, 120,120,120,160,160,160, 200,200,200,
9. 76,0,13, 113,52,0, 127,91,0, 188,114,0, 203,140,68, 236,211,190,
10. 0,0,121, 93,0,158, 91,20,237, 255,61,255, 170,110,240, 200,161,245,
11. 38,88,0, 77,118,46, 66,130,98, 112,182,46, 118,197,124, 174,221,178,
12. 19,57,96, 10,98,163, 0,160,171, 0,242,255, 59,245,255, 139,247,255
13.};
14.
15.class g_point
16.{
17.public:
18. g_point();
19. g_point(int x_i, int y_i);
20. g_point(int x_i, int y_i, int lbl_i);
21.public:
22. int x;
23. int y;
24. int lbl; //标签
25.};
26.
27.g_point:
:
g_point(int x_i, int y_i)
28.{
29. x = x_i;
30. y = y_i;
31. lbl = SEED;
32.}
33.
34.g_point:
:
g_point()
35.{
36. x = 0;
37. y = 0;
38. lbl = INIT;
39.}
40.
41.g_point:
:
g_point(int x_i, int y_i, int lbl_i)
42.{
43. x = x_i;
44. y = y_i;
45. lbl = lbl_i;
46.}
47.
48.void regionGrowth(IplImage* img, int* p_mat, int x_g, int y_g, int threshold_g)
49.{
50. //常用变量:
51. int x;
52. int y;
53. int gradient = 0;
54.
55.
56. //设置前次边缘点
57. std:
:
list
58. std:
:
list
59.
60.
61. //设置边缘点
62. std:
:
list
63. std:
:
list
64.
65.
66. //种子点+边缘点 = 下次的种子点
67. //上次的边缘点 = 前次边缘点(用于下次减少点数)
68. cont_pts_pre.push_back(class g_point(x_g, y_g, CONT));
69. p_mat[y_g * img->width + x_g] = SEED;
70.
71. std:
:
list
:
iterator iter_cont;
72. std:
:
list
:
iterator iter_prt;
73. std:
:
list
:
iterator iter_swap;
74.
75.
76.
77.
78. while( !
cont_pts_pre.empty() )
79. {
80.
81.
82.
83. //一轮生长
84. iter_cont = cont_pts_pre.begin();
85. while(iter_cont !
= cont_pts_pre.end())
86. {
87. x = (*iter_cont).x;
88. y = (*iter_cont).y;
89. // if( !
(x-1<0 || y-1<0) ) //#1
90. // {
91. // if(p_mat[(y-1)*img->width + (x-1)] == INIT)
92. // {
93. // gradient = ((char*)(img->imageData + y*img->widthStep))[x] -
94. // ((char*)(img->imageData + (y-1)*img->widthStep))[x-1];
95. // if(abs(gradient) < threshold_g) //满足阈值要求
96. // {
97. // cont_pts.push_back(class g_point(x-1, y-1, CONT));
98. // p_mat[(y-1)*img->width + (x-1)] = SEED;
99. // }
100. // else //不满足阈值要求
101. // {
102. // p_mat[(y-1)*img->width + (x-1)] = INVAL;
103. // }
104. // }
105. // }
106. if( !
(x-1<0) ) //#2
107. {
108. if(p_mat[(y)*img->width + (x-1)] == INIT)
109. {
110. gradient = ((char*)(img->imageData + y*img->widthStep))[x] -
111. ((char*)(img->imageData + (y)*img->widthStep))[x-1];
112. if(abs(gradient) < threshold_g) //满足阈值要求
113. {
114. cont_pts.push_back(class g_point(x-1, y, CONT));
115. p_mat[(y)*img->width + (x-1)] = SEED;
116. }
117. else //不满足阈值要求
118. {
119. p_mat[(y)*img->width + (x-1)] = INVAL;
120. }
121.
122. }
123. }
124. // if( !
(x-1<0 || y+1 >= img->height) ) //#3
125. // {
126. // if(p_mat[(y+1)*img->width + (x-1)] == INIT)
127. // {
128. // gradient = ((char*)(img->imageData + y*img->widthStep))[x] -
129. // ((char*)(img->imageData + (y+1)*img->widthStep))[x-1];
130. // if(abs(gradient) < threshold_g) //满足阈值要求
131. // {
132. // cont_pts.push_back(class g_point(x-1, y+1, CONT));
133. // p_mat[(y+1)*img->width + (x-1)] = SEED;
134. // }
135. // else //不满足阈值要求
136. // {
137. // p_mat[(y+1)*img->width + (x-1)] = INVAL;
138. // }
139. //
140. // }
141. // }
142. if( !
(y+1 >= img->height) ) //#4
143. {
144. if(p_mat[(y+1)*img->width + (x)] == INIT)
145. {
146. gradient = ((char*)(img->imageData + y*img->widthStep))[x] -
147. ((char*)(img->imageData + (y+1)*img->widthStep))[x];
148. if(abs(gradient) < threshold_g) //满足阈值要求
149. {
150. cont_pts.push_back(class g_point(x, y+1, CONT));
151. p_mat[(y+1)*img->width + (x)] = SEED;
152. }
153. else //不满足阈值要求
154. {
155. p_mat[(y+1)*img->width + (x)] = INVAL;
156. }
157. }
158. }
159. // if( !
(x+1>=img->width || y+1>=img->height) ) //#5
160. // {
161. // if(p_mat[(y+1)*img->width + (x+1)] == INIT)
162. // {
163. // gradient = ((char*)(img->imageData + y*img->widthStep))[x] -
164. // ((char*)(img->imageData + (y+1)*img->widthStep))[x+1];
165. // if(abs(gradient) < threshold_g) //满足阈值要求
166. // {
167. // cont_pts.push_back(class g_point(x+1, y+1, CONT));
168. // p_mat[(y+1)*img->width + (x+1)] = SEED;
169. // }
170. // else //不满足阈值要求
171. // {
172. // p_mat[(y+1)*img->width + (x+1)] = INVAL;
173. // }
174. //
175. // }
176. // }
177. if( !
(x+1>=img->width) ) //#6
178. {
179. if(p_mat[(y)*img->width + (x+1)] == INIT)
180. {
181. gradient = ((char*)(img->imageData + y*img->widthStep))[x] -
182. ((char*)(img->imageData + (y)*img->widthStep))[x+1];
183. if(abs(gradient) < threshold_g) //满足阈值要求
184. {
185. cont_pts.push_back(class g_point(x+1, y, CONT));
186. p_mat[(y)*img->width + (x+1)] = SEED;
187. }
188. else //不满足阈值要求
189. {
190. p_mat[(y)*img->width + (x+1)] = INVAL;
191. }
192.
193. }
194. }
195. // if( !
(x+1>=img->width || y-1<0) ) //#7
196. // {
197. // if(p_mat[(y-1)*img->width + (x+1)] == INIT)
198. // {
199. // gradient = ((char*)(img->imageData + y*img->widthStep))[x] -
200. // ((char*)(img->imageData + (y-1)*img->widthStep))[x+1];
201. // if(abs(gradient) < threshold_g) //满足阈值要求
202. // {
203. // cont_pts.push_back(class g_poin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 区域 生长 编程 实现 程序员 数字图像 处理 第一步