冈萨雷斯的数字图像处理教材第九章形态学图像处理9.27题描述如下:

在显微镜方法应用方面的一个预处理是从两个或更多的交叠成堆的颗粒(见下图pic.tif)中分离出单个独立的颗粒。假设所有颗粒具有相同的大小,提出一种形态学算法产生3幅图像,分别包含:

a.仅与图像边界融合在一起的颗粒

b.彼此交叠的颗粒

c.未交叠在一起的颗粒

c.pic pic.tif(代码中的输入图片) —

题目虽然要求是利用形态学的方法来处理,抛开形态学来看这个问题。从颗粒特征出发,三种类型的颗粒有什么特点呢?

想法一:显然,与边界融合的颗粒在面积上应该小于单个颗粒的面积,而单个颗粒的面积应该小于交叠颗粒的面积。这里的面积是颗粒包含的像素的数目。

想法二:沿着这种比较朴素的想法,很容易得出,在轮廓线的长度上也存在这个关系。

关于上述两个想法的实现,关键是要找到单个颗粒的特征,这依托于边缘提取算法的效果。下边是一个ToyCode(想法二的验证代码):

上述代码是一个关于两个想法相对粗糙的实现,在细节上需要考虑噪声,平滑,阈值等。

回到形态学的角度,先上代码如下(感谢实验室的冒冒同学提供):

重点关注29~60行之间的代码,为了更好的理解形态学的思路,先回顾几个重要概念。

腐蚀:一种消除边界点,使边界向内部收缩的过程,可以用来消除小且没有意义的物体。

膨胀:将与物体接触的所有背景点合并到该物体中,是边界向外部扩张的过程,可以用来填补物体中的空洞。

结构元素:与二值图像进行邻域运算,进而实现腐蚀和膨胀。形态学运算效果与结构元素关系紧密。

回到代码,整体上的思路是:先对图像进行腐蚀操作,由于交叠颗粒和单个颗粒及边缘颗粒面积不同,通过腐蚀操作,使得不同颗粒收缩。后通过滤波算法消除较小的颗粒区域,只留下最大的颗粒区域,也就是原图中交叠颗粒对应的腐蚀后的颗粒图像。后对滤波后的图像进行膨胀操作,尽量恢复原图对应区域。在阈值处理阶段,对照膨胀后图像,在原图中将非交叠区域抹黑,剩下的就是交叠颗粒图像了。

总结:不论是基于边缘提取还是基于形态学的方法,应该都是一个比大小问题。