不适合纯新手,因为很多基础知识没有提及
split-merge图像分割,在这篇文章中,指的并不是图像的通道的分离与通道的合并,而是图像的区域分离与合并,这两种的英文名字似乎有点相似,没学过的人看名字就混淆了。
早就学过区域分离与合并的算法,但是算法的种类太多,并不是每一个都有自己去实现一遍的价值。今天有时间就整理一下这个东西。和大家分享,有不同的见解与我讨论欢迎留言(我也不知道这文章下能不能留言,哈),首页上有联系方式,加我联系方式讨论吧。
如果是纯新手,不太适合看这些东西,因为有些东西在书上描述的很清楚,这里不重复说明这些重复内容
Quick Start
原理
原理简述
把图像细分为任意互相不相连的区域,在一定的规则下合并或者分离这些区域。在网上和书中的介绍中,将是否进行合并或分离的条件称之为谓词 P。其实就是条件P。满足则合并,不满足则分离。程序的核心思路就是上面那些。其细致的描述在书中可以查到。(比如冈萨雷斯的《数字图像处理》),不重复描述了。
程序的思路可以总结为一下的步骤:
1.把任意区域Ri分为4个不相连的象限,其满足P(Ri);
2.当不可能在分时,合并任何满足P(Rj
⋃
⋃
Rk)=True的区域Rj和Rk;
3.不能进一步合并时,则停止。
P(Rj
⋃
⋃
Rk)=True的区域Rj和Rk;
程序则可能有多种变体,比如在分裂的同时合并等。在步骤2中,满足条件的使用1或者255来填充,不满足用0来填充,则很容易检测出其连通性,最终得到一副分割图像。
注意的点
图像的尺寸如果不是2的整数次幂,最后将无法保证最后分离的到尺寸为1的区域。如果非要处理这种图像,算法需要作出一定的更改。
程序有多种变种,这个会影响到程序的效率和显示效果。
改变分裂与合并标准是改动程序的重要方向,可以得到不同的合并效果和分裂效果。如均方差等等。所以网上的程序有很多,但是结果图却有些不一样,要仔细看程序采用了哪些方法。
我自己用c++按照上面思路写的代码。运行效果如下:
如图,用窗口和划线显示了分裂和合并的过程,用struct 和stack解决的分裂时的存储问题。改程序采用了经典的四叉树分裂。不会适配所有尺寸的图像,随意图像并不完美。
为了方便读入图片和显示图片,我这里调用了opencv库。其代码已经上传至csdn上,毕竟有时候还是要下载点程序的。这种东西都是单个的算法,算不上项目要求,就不放在github上了,太难看。
这次就写那么多吧。更细致的内容全在书里了
参考内容
冈萨雷斯的《数字图像处理》
《精通matlab数字图像处理与识别》