寻找图像中的凹坑

Abi*_*n K 10 matlab opencv image-processing computer-vision scikit-image

我的一位朋友正在研究以下项目:

下面是不锈钢表面的微观(SEM)图像.

在此输入图像描述

但你可以看到,它被腐蚀了一点(长时间暴露在海洋环境中)并且在表面形成了一些凹坑.一些坑被标记为红色圆圈.

他需要在图像中找到凹坑数量并且他手动计算它(想象一下,有近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)
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

然后我为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() 
Run Code Online (Sandbox Code Playgroud)

但它最终导致了很多额外的噪音.看下面的结果:

在此输入图像描述


附加信息:

一些测试图像:

在此输入图像描述 在此输入图像描述

Lov*_*ill 6

您的案例让我想起了一篇论文(使用移动平台的人体检测和源自视觉显着性机制的新特征),它基于中心神经节细胞概念计算图像上的显着性,即检测被黑暗区域包围的明亮像素的方法(或相反称为偏心细胞).

神经节细胞

要近似这些单元格,您可以使用矩形区域.通过使用积分图像,您可以加快程序.查看纸张了解详情.

还有一个想法是复合滤波器的卷积.找到一个非常接近每个凹坑的模板,并将模板与图像相关联(或使用多个过滤器进行缩放/形状变化).