我的一位朋友正在从事以下项目:
下面是不锈钢表面的显微 (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)
结果:
然后我为 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()
但它最终产生了很多额外的噪音。看下面的结果:
附加信息:
一些测试图像: