模糊图像中用于物体检测(圆形)的好用的Python工具

3

我有一些类似这样的透射电子显微镜图像:

TEM

有没有Python模块可以帮助我分析这张图片,特别是在图片中检测出原子(圆形)?

由于TEM图像的质量相当糟糕,因此我需要一种足够强大的方法来区分什么是原子和什么不是。

我可以很容易地使用PIL打开图片并对其进行处理,但我希望能找到一种算法来检测圆形。

如果没有这样的工具,是否有人知道如何制作自己的算法来完成这个任务?


我知道Hough变换是一种用于实现类似这样事情的技术。或许这能帮到你在搜索中? - Lanaru
1
看一下OpenCV和/或Tesseract,但我不确定你会有多大的成功。我的肉眼几乎无法检测出图片中的圆圈在哪里。获取一个工具或库来完成这个任务可能几乎是不可能的。 - Andenthal
@andenthal 这正是我担心的。我会尝试一下,但我认为我需要重新开始。 - still learning
1
我进行了快速搜索并找到了这个。看看吧,也许就是你要找的东西。编辑:不要轻易放弃... - Lanaru
@Lanaru 我还没有放弃,我想尝试所有可能的解决方案。只是对结果有些犹豫。 - still learning
没有明确的规范,没有人能够做到。 - Daniel Daranas
1个回答

2
以下是使用OpenCV尝试计算您图片中原子数量的方法。这种方式有点儿不太严谨,但是可以得到不错的结果。首先对图片进行一定程度的模糊处理,然后进行阈值处理,最后找到对应的轮廓。
以下是代码:
import cv2
image = cv2.imread('atoms.png')
image2 = cv2.cvtColor(
    image,
    cv2.COLOR_BGR2GRAY, 
    )
image2 = cv2.GaussianBlur(
    image2, 
    ksize=(9,9), 
    sigmaX=8,
    sigmaY=8,
    )
cv2.imwrite('blurred.png', image2)
hello, image2 = cv2.threshold(
    image2,
    thresh=95,
    maxval=255,
    type=cv2.THRESH_BINARY_INV,
    )
cv2.imwrite('thresholded.png', image2)
contours, hier = cv2.findContours(
    image2,  # Note: findContours() changes the image.
    mode=cv2.RETR_EXTERNAL,
    method=cv2.CHAIN_APPROX_NONE,
    )
print('Number of contours: {0}'.format(len(contours)))
cv2.drawContours(
    image,
    contours=contours,
    contourIdx=-1,
    color=(0,255,0),
    thickness=2,
    )
cv2.imwrite('augmented.png', image)
cv2.imshow('hello', image)
cv2.waitKey(-1)

标准输出如下:

Number of contours: 46

花一些时间调整高斯模糊和阈值参数,我打赌你可以得到更准确的结果。

1
哇,这看起来相当不错。我得在周一早上仔细研究一下它。 - still learning
2
这是一个很好的答案,这个问题不应该被关闭。 - Saullo G. P. Castro

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