首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在图像中寻找凹坑

在图像中寻找凹坑
EN

Stack Overflow用户
提问于 2014-05-07 11:42:56
回答 1查看 619关注 0票数 10

我的一位朋友正在从事以下项目:

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

但你可以看到,它被腐蚀了一点点(长期暴露在海洋环境中),一些坑在表面形成。有些坑是红色圆圈标记的。

他需要在图像中找到凹坑的数目,并且他正在手工计算(想象一下,有将近150张图像)。所以我想用任何图像处理工具来实现这个过程的自动化。

问题: 我怎样才能在这张图片中找到凹坑的数目?

我尝试了什么:

作为第一步,我通过关闭操作稍微改进了对比。

代码语言:javascript
复制
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的范围作为经验值)。

代码语言:javascript
复制
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() 

但最后却产生了很多额外的噪音。见以下结果:

附加信息:

一些测试图像:

EN

回答 1

Stack Overflow用户

发布于 2014-05-07 12:39:35

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

若要近似这些单元格,可以使用矩形区域。通过使用积分图像,可以加快程序的速度。查看这份文件以了解细节。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23516870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档