区域生长法的编程实现——程序员数字图像处理第一步.docx_第1页
区域生长法的编程实现——程序员数字图像处理第一步.docx_第2页
区域生长法的编程实现——程序员数字图像处理第一步.docx_第3页
区域生长法的编程实现——程序员数字图像处理第一步.docx_第4页
区域生长法的编程实现——程序员数字图像处理第一步.docx_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字图像处理的书数不胜数。相关的方法,从直方图、卷积到小波、机器学习方面的方法也举不胜举。OpenCV库给我们提供了一整套图像存储、显示方法外,也集成了很多很多的图像、视频处理算法以及机器学习算法,以函数的形式提供给我们使用。然而在初学阶段,我们往往过分依赖于OpenCV中的那些库函数。虽说OpenCV集成了很多高效算法,然而,毕竟不是无所不包。OpenCV中基础的算法有时会缺失,有时用起来不是很得心应手。区域生长算法就是一例。区域生长法,思路很简单:将一个图像中的一点作为种子,此种子会沿8邻域/4邻域进行扩展,扩展具有一定限制(即差值不能过大,当然你可以引入梯度这个概念,甚至二维偏导数),求出种子生长的最终结果。把示例程序的几张结果发过来,何谓区域生长法,大家一看便知。区域生长法对于较为均衡的背景中提取目标物而言,效果较为理想。与阈值法、边缘检测法孰优孰劣,俺笔力及精力有限,不进行比较了。单从工程角度,区域生长法是统计闭合图形个数的基础。这里自己写了一下这个程序的演示代码,只负责将背景同生长不上去的区域分开:cppview plaincopy1. #defineINIT02. #defineSEED-13. #defineCONT-24. #defineINVAL-35. 6. intcolor_templ5*6*37. =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,25513. ;14. 15. classg_point16. 17. public:18. g_point();19. g_point(intx_i,inty_i);20. g_point(intx_i,inty_i,intlbl_i);21. public:22. intx;23. inty;24. intlbl;/标签25. ;26. 27. g_point:g_point(intx_i,inty_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(intx_i,inty_i,intlbl_i)42. 43. x=x_i;44. y=y_i;45. lbl=lbl_i;46. 47. 48. voidregionGrowth(IplImage*img,int*p_mat,intx_g,inty_g,intthreshold_g)49. 50. /常用变量:51. intx;52. inty;53. intgradient=0;54. 55. 56. /设置前次边缘点57. std:listcont_pts_pre;58. std:list*pcont_pts_pre=&cont_pts_pre;59. 60. 61. /设置边缘点62. std:listcont_pts;63. std:list*pcont_pts=&cont_pts;64. 65. 66. /种子点+边缘点=下次的种子点67. /上次的边缘点=前次边缘点(用于下次减少点数)68. cont_pts_pre.push_back(classg_point(x_g,y_g,CONT);69. p_maty_g*img-width+x_g=SEED;70. 71. std:list:iteratoriter_cont;72. std:list:iteratoriter_prt;73. std:list:iteratoriter_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-10|y-1width+(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)width+(x-1)=SEED;99. /100. /else/不满足阈值要求101. /102. /p_mat(y-1)*img-width+(x-1)=INVAL;103. /104. /105. /106. if(!(x-1width+(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)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=img-height)/#3125. /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)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)/#4143. 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)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)/#5160. /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)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)/#6178. 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)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-1width+(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)width+(x+1)=SEED;205. /206. /else/不满足阈值要求207. /208. /p_mat(y-1)*img-width+(x+1)=INVAL;209. /210. /211. /212. /213. if(!(y-1width+(x)=INIT)216. 217. gradient=(char*)(img-imageData+y*img-widthStep)x-218. (char*)(img-imageData+(y-1)*img-widthStep)x;219. if(abs(gradient)width+(x)=SEED;223. 224. else/不满足阈值要求225. 226. p_mat(y-1)*img-width+(x)=INVAL;227. 228. 229. 230. 231. iter_cont+;232. 233. 234. /将cont_pts中的点赋给cont_pts_pre235. cont_pts_pre.clear();236. iter_swap=cont_pts.begin();237. while(iter_swap!=cont_pts.end()238. 239. cont_pts_pre.push_back(*iter_swap);240. iter_swap+;241. 242. cont_pts.clear();243. 244. 245. 246. /结束while247. 248. 249. 250. 251. cont_pts_pre.clear();252. cont_pts.clear();253. 254. /deletepseed_pts;255. /deletepcont_pts_pre;256. /deletepcont_pts;257. 258. 259. 260. voiddisplay_mat(int*p_mat,intwidth,intheight)261. 262. IplImage*disp;263. disp=cvCreateImage(cvSize(width,height),8,3);264. cvZero(disp);265. 266. for(inth=0;hheight;h+)267. 268. for(intw=0;wimageData+h*disp-widthStep)w*3+0=color_templ0*18+0*3+0;273. (UCHAR*)(disp-imageData+h*disp-widthStep)w*3+1=color_templ0*18+0*3+1;274. (UCHAR*)(disp-imageData+h*disp-widthStep)w*3+2=color_templ0*18+0*3+2;275. 276. elseif(p_math*width+w=INIT)277. 278. (UCHAR*)(disp-imageData+h*disp-widthStep)w*3+0=color_templ0*18+2*3+0;279. (UCHAR*)(disp-imageData+h*disp-widthStep)w*3+1=color_templ0*18+2*3+1;280. (UCHAR*)(disp-imageData+h*disp-widthStep)w*3+2=color_templ0*18+2*3+2;281. 282. elseif(p_math*width+w=INVAL)283. 284. (UCHAR*)(disp-imageData+h*disp-widthStep)w*3+0=color_templ0*18+4*3+0;285. (UCHAR*)(disp-imageData+h*disp-widthStep)w*3+1=color_templ0*18+4*3+1;286. (UCHAR*)(disp-imageData+h*disp-widthStep)w*3+2=color_templ0*18+4*3+2;287. 288. 289. 290. cvNamedWindow(display);291. cvShowImage(display,disp);292. cvWaitKey(0);293. 294. cvDestroyWindow(display);295. cvReleaseImage(&disp);296. 297. 298. 299. int_tmain(intargc,_TCHAR*argv)300. 301. IplImage*img;302. img=cvLoadImage(1.bmp,CV_LOAD_IMAGE_ANYCOLOR);303. 304. 305. /建立需要使用的单通道8位深图像306. IplImage*img_gray;307. img_gray=cvCreateImage(cvGetSize(img),img-depth,1);308. cvSplit(img,NULL,img_gray,NULL,NULL);309. 310. cvNamedWindow(originalimage,-1);311. cvShowImage(originalimage,img_gray);312. cvWaitKey(0);313. 314. /建立所需的与图像同样宽高的整型数矩阵并赋初值315. int*pres_mat;316. pres_mat=newintimg_gray-width*img_gray-height;317. for(inti=0;iwidth*img_gray-height;i+)318. 319. pres_mati=INIT;320. 321. 322. /开始进行区域生长323. regionGrowth(img_gray,pres_mat,1,1,50);324. 325. display_mat(pres_mat,img_gray-width,img_gray-height);326. 327. return0;328. regionGrowth函数详解参数:img:需要进行区域生长的图像,8位单通道的IplImagep_map:整型数矩阵指针,宽高与图像相同,用于储存图像生长结果矩阵已经被全部赋值为INIT(#define INIT 0)x_g, y_g区域生长初始种子点threshold_g区域生长邻域梯

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论