资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
数字图像处理的书数不胜数。相关的方法,从直方图、卷积到小波、机器学习方面的方法也举不胜举。OpenCV 库给我们提供了一整套图像存储、显示方法外,也集成了很多很多的图像、视频处理算法以及机器学习算法,以函数的形式提供给我们使用。然而在初学阶段,我们往往过分依赖于 OpenCV 中的那些库函数。虽说 OpenCV 集成了很多高效算法,然而,毕竟不是无所不包。OpenCV 中基础的算法有时会缺失,有时用起来不是很得心应手。区域生长算法就是一例。区域生长法,思路很简单:将一个图像中的一点作为种子,此种子会沿 8 邻域/4 邻域进行扩展,扩展具有一定限制(即差值不能过大,当然你可以引入梯度这个概念,甚至二维偏导数),求出种子生长的最终结果。把示例程序的几张结果发过来,何谓区域生长法,大家一看便知。区域生长法对于较为均衡的背景中提取目标物而言,效果较为理想。与阈值法、边缘检测法孰优孰劣,俺笔力及精力有限,不进行比较了。单从工程角度,区域生长法是统计闭合图形个数的基础。这里自己写了一下这个程序的演示代码,只负责将背景同生长不上去的区域分开:cpp view plaincopy1.#define INIT 0 2.#define SEED -1 3.#define CONT -2 4.#define INVAL -3 5. 6.int color_templ5*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 cont_pts_pre; 58. std:list * pcont_pts_pre = 59. 60. 61. /设置边缘点 62. std:list cont_pts; 63. std:list * pcont_pts = 64. 65. 66. /种子点+边缘点 = 下次的种子点 67. /上次的边缘点 = 前次边缘点(用于下次减少点数) 68. cont_pts_pre.push_back(class g_point(x_g, y_g, CONT); 69. p_maty_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-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) ) /#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) 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
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号