在图像中查找坑洞

10

我的一个朋友正在开展以下项目:

下面是不锈钢表面的显微镜(SEM)图像。

enter image description here

但是你可以看到,它有一点腐蚀(在良久暴露于海洋环境后),并且表面上形成了一些凹坑。其中一些凹坑用红色圆圈标记出来。

他需要找到图像中的凹坑数量,并手动计数(想象一下,有近150张图片)。因此我想通过任何图像处理工具自动化这个过程。

问题:

如何找到这个图像中的凹坑数量?


我尝试过的方法:

作为第一步,我通过闭运算稍微改善了对比度。

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('6.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))

close = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)

close2 = cv2.add(close,1)
div = (np.float32(gray)+1)/(close2)
div2 = cv2.normalize(div,None, 0,255, cv2.NORM_MINMAX)
div3 = np.uint8(div2)

结果:

在此输入图像描述

然后我对其应用了一些阈值为127,并在其中找到轮廓。之后,这些轮廓根据它们的面积进行了过滤(没有关于面积的具体信息,我将其作为经验值取一个1-10的范围)。

ret, thresh = cv2.threshold(div3, 127,255, cv2.THRESH_BINARY_INV)
temp, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

res = np.zeros(gray.shape,np.uint8)

for cnt in contours:
    if 1.0 < cv2.contourArea(cnt) < 10.0:
        res = cv2.drawContours(res, [cnt], 0, 255, -1)

plt.subplot(121); plt.imshow(img, 'gray'); plt.subplot(122); plt.imshow(res,'gray'); plt.show() 

但最终出现了很多额外的噪声。请参见下面的结果:

在此输入图片描述


附加信息:

一些测试图片:

在此输入图片描述 在此输入图片描述


1
另一种进行预处理步骤的方法是这样的:http://scikit-image.org/docs/dev/auto_examples/plot_holes_and_peaks.html - Stefan van der Walt
1个回答

6
你的情况让我想起了一篇论文(使用移动平台和由视觉显著性机制推导出的新颖特征进行人类检测),该论文基于中心感受器概念计算图像的显著性,即检测被暗区域(或反之为 off-center cells)包围的亮像素点。
为了近似这些细胞,可以使用矩形区域。通过使用积分图像,可以加快过程。请查看论文以获取详细信息。
还有一个想法是卷积复合滤波器。找到与每个坑非常接近的模板,并将模板与图像相关联(或使用多个滤镜进行尺度/形状变化)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接