天天看点

图像分区算法

在图像处理当中经常会遇到,把相近颜色的区域提取出来的问题

如果是交互操作,指定图像上的一个点,找到该点对应的颜色区域的方法已经很成熟了——种子填充或者是扫描线填充等算法,这里就不赘述了。

问题是,如何对于给定的一个图像,自动找到所有的独立的颜色区域呢,为了简化问题,可以假定这个图像是黑白二值的,如何找到这个图像上所有的黑色的连通区域,并且给每个区域一个独立的区号呢

我们假定连通关系是8连通

可以这样来解决这个问题

为了形象的说明问题,我们假定图像的扫描从下向上,从左向右

在扫描第一行的时候,为每个独立的连通的黑色区域(线段)赋予一个不同的区域数值,这个只是一个扫描填充

在以后扫描每一行的时候,对于每个黑色点,检查它所在位置的前一行上的相邻点所归属的区域有几个,『注意:虽然有3个相邻点(8连通)但是最多归属两个黑色区域』,如果只有一个区域,那么把当前点也归属其中;如果有两个区域,那么把当前点归属第一个区域,并且从这里开始回填第二个区域的所有的点;如果扫描到的黑点的上一行没有黑区域和它连通,还要检测它左侧点是否是黑点,是就归属其中;否这就是一个全新区域的开始。

直到所有的图像扫描处理完毕,分区也同步完成

在扫描到一个点,它同时归属两个独立的区域的时候是处理的关键

好比一个h形状的区域,从下向上扫描的时候,刚开始,h的两个腿是不同的区域,这个时候就好比两个管道,左边用红色墨水灌入,右边用清水灌入,当到达h的中间部位的时候,两个管道相通了,那么左侧的红色墨水迅速的把右侧的清水区域染成了红色。

这种区域重新归属的现象发生的次数和区域的形状有关系

继续阅读