我正在分析TEM/STEM扫描图像。白色圆圈是原子,而黑色是背景。捕获的图像有噪声。圆圈边界不清楚。
有没有办法增强图像以显示圆的边界?
我运行下面的代码:
#Python code
import numpy as np
import cv2
import matplotlib.pyplot as plt
from skimage import feature
from scipy.optimize import curve_fit
img = cv2.imread('input_image.tif', cv2.IMREAD_GRAYSCALE)
img_noise_removed = cv2.medianBlur(img, 3)
mask = cv2.GaussianBlur(img_noise_removed, (101, 101), 0)
img_subtracted = cv2.absdiff(img_noise_removed, mask)
edges = feature.canny(img_subtracted, sigma=1)
cv2.imwrite('noise_removed_image.tif', img_noise_removed)
但它并没有解决原子边界问题。
代码的第二部分
import cv2
import numpy as np
from skimage.feature import peak_local_max
from skimage.filters import threshold_otsu
img = cv2.imread('test2.tif', cv2.IMREAD_GRAYSCALE)
# median filter and a Laplacian filter
img_median = cv2.medianBlur(img, 3)
img_laplacian = cv2.Laplacian(img_median, cv2.CV_64F, ksize=3)
# Threshold the image using Otsu's method
thresh = threshold_otsu(img_laplacian)
binary = img_laplacian > thresh
# Finding the coordinates of the local maxima in the image
coords = peak_local_max(binary, min_distance=5, threshold_abs=0.3)
# Writing the coordinates to a text file
with open('coordinates.txt', 'w') as f:
for coord in coords:
f.write('{} {}\n'.format(coord[1], coord[0]))
3条答案
按热度按时间ua4mk5z41#
其他两个答案试图提取每个原子的轮廓,然后找到这些轮廓的质心。我认为这是错误的方法,你想使用图像中的灰度值不仅仅是找到轮廓。通过计算灰度加权一阶矩(灰度斑点的质心,而不是轮廓的质心),你可以得到一个更精确的结果。而且,你可以得到这个结果,而不过滤图像第一。
我假设示例图像与您处理的实际图像相当。如果实际图像的噪声更大,您可能需要调整分水岭函数的一些参数,使其对噪声具有鲁棒性。
我使用的是DIPlib [免责声明:我是一名作家],因为我比OpenCV更熟悉它,而且因为DIPlib是用于精确测量的,这与OpenCV不同。
这将打印出一个包含325个项目的列表:
请注意,图像边缘的原子会有错误的质心,我建议在这些测量中忽略它们,例如,通过丢弃离图像边界太近的质心。
labels
图像如下所示:你会注意到我们测量的区域非常松散。唯一的目标是包含每个原子的完整斑点,以便质心测量正确工作。我们不关心这些区域的确切范围,它们包含的任何较暗像素都不会对结果产生太大影响。
如果您检查中间的
labels
图像并注意到一个原子有多个区域,这意味着你的图像中的噪点比我们这里的例子图像中的噪点多。在这种情况下,你需要将maxDepth
参数调整为dip.Watershed()
。这个参数控制区域的合并。增加这个参数(默认值为1)将导致更少的区域。你必须调整它,直到你看到每个原子正好有一个区域。pprl5pva2#
下面是在Python/OpenCV中找到原子质心的一种方法。
输入:
阈值:
结果:
bf1o4zei3#
您的问题类似于https://stackoverflow.com/a/17116465/1510289,并且我相信类似的解决方案将适用于您的情况,即在模糊之后应用阈值,直到您生成满意的轮廓,即边界。
下面是代码(在链接中提到),但参数定制为您的特定输入图像,以产生准确的轮廓。
模糊.png:
阈值.png:
扩充的.png: