区域生长法的编程实现——程序员数字图像处理第一步
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理的书数不胜数。
相关的方法,从直方图、卷积到小波、机器学习方面的方法也举不胜举。
OpenCV库给我们提供了一整套图像存储、显示方法外,也集成了很多很多的图像、视频处理算法以及机器学习算法,以函数的形式提供给我们使用。
然而在初学阶段,我们往往过分依赖于OpenCV中的那些库函数。
虽说OpenCV集成了很多高效算法,然而,毕竟不是无所不包。
OpenCV中基础的算法有时会缺失,有时用起来不是很得心应手。
区域生长算法就是一例。
区域生长法,思路很简单:将一个图像中的一点作为种子,此种子会沿8邻域/4邻域进行扩展,扩展具有一定限制(即差值不能过大,当然你可以引入梯度这个概念,甚至二维偏导数……),求出种子生长的最终结果。
把示例程序的几张结果发过来,何谓区域生长法,大家一看便知。
区域生长法对于较为均衡的背景中提取目标物而言,效果较为理想。
与阈值法、边缘检测法孰优孰劣,俺笔力及精力有限,不进行比较了。
单从工程角度,区域生长法是统计闭合图形个数的基础。
这里自己写了一下这个程序的演示代码,只负责将背景同生长不上去的区域分开:
[cpp]view plaincopy
regionGrowth函数详解
参数:
img:需要进行区域生长的图像,8位单通道的IplImage
p_map:整型数矩阵指针,宽高与图像相同,用于储存图像生长结果
矩阵已经被全部赋值为INIT(#define INIT 0)
x_g, y_g区域生长初始种子点
threshold_g区域生长邻域梯度的阈值
生长过程中存储中间数据的容器:
list<class g_point> cont_pts
//contour points 生长边缘链表
list<class g_point> cont_pts_pre
//contour points previously前次生长边缘链表
class g_point为自定义的一个类,具有3个整型数成员变量:x,y坐标以及点点类型函数lbl
处理过程:
第一步,初始生长点(x_g, y_g):将此点坐标压入cont_pts_pre矩阵,并在矩阵上将此点标注为SEED
第二步,第一轮生长:
将cont_pts清空,存储此轮生长点边缘点。
访问cont_pts_pre中的每一个点,对点进行四邻域/八邻域生长条件判断。
若满足生长条件,1、将该点接到cont_pts末尾;供下轮生长使用。
2、在矩阵上将词典标注为SEED。
若不满足生长条件,之在矩阵上将此点标注为INVAL。
(以后的边界,便可由INVAL来确定)
这一步骤,是由程序中连着的8个if语句完成。
第三步,为下一轮生长做准备。
将cont_pts_pre清空,将cont_pts赋值给cont_pts_pre
接下来的步骤,第2、3、4、……轮生长
迭代终止条件:cont_pts_pre为空,则无点可生长。
处理结果
在p_map中,生长到的点取值为:SEED;未生长到的点:INIT;边界点:INVAL
在编写过程中,考虑过迭代次数、各类点的存储选择的数据结构等限制区域生长法效率的因素。
俺将日后写一个运算量、处理时间的评估报告。
RegionGrowth经过优化后的程序,在此处。
/detail/sera_ph/4505725
第一次上传资源,没有设置资源积分。
希望大家能用得爽快。
此程序可将不同的联通区域用区别开来,处理的结果为:。