之前的阈值分割是通过像素的特性分布为基础的阈值处理来完成的。而现在我们就来实现基于区域的分割。
区域增长
区域增长是指,根据预先定义的生长准则,将符合规则的像素组合为大区域的过程。
基本方法就是取一组“种子”点开始,从种子点四周开始检索,将符合生长准则的点都纳入种子点当中,直到种子四周都没有符合条件的像素点为止。
比如,生长准则为
那么,只要种子点四周的点与种子点的像素值相差在1以内,即纳入种子点之中。
那么计算方法就很简单了。
1,提取出图像$S(x,y)$的连通分量(即边界),然后,将所有属于边界的地方标记为1。
2,对输入的图像$f(x,y)$,根据输入的种子点的位置,进行8-联通种子点搜索,若符合条件$Q$,则纳入种子点当中,并标记。
3,根据标记出的值进行图像的输出。
在这里,我实现的例子
代码实现
1 | int main(){ |
区域分裂与聚合
这种方法则是,不利用种子值,而是直接分裂一幅图像,然后再对合适的区域进行聚合得到合适的区域。
1,对图片进行分裂,分裂为左上,左下,右上,右下的四等分的区域
2,对图片的区域进行判断,求其平均灰度值,若灰度值不符合规则,则对该区域继续分裂(回到步骤一),否则,标记为true
3,对分裂完成的图片进行聚合,遍历分裂区域
4,若两个分裂区域是相邻的,则合并之
这样,就可以完成对一个图片的分裂了。
代码实现
这里的实现方式与上面的区域增长其实是差不多的。只是多出了一个对分裂出来的区域进行标记的数据结构而已。
1 | struct Region |