基于OpenCV的STEM/TEM图像原子边界增强技术咨询
TEM/STEM图像原子边界增强方案
问题背景
分析TEM/STEM扫描图像时,白色圆形为原子、黑色为背景,但图像存在噪声,原子的圆形边界模糊。尝试了两段代码(如下),均无法清晰呈现原子边界,寻求有效增强方法。

第一段尝试代码
# Python代码 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) # 中值滤波+拉普拉斯滤波 img_median = cv2.medianBlur(img, 3) img_laplacian = cv2.Laplacian(img_median, cv2.CV_64F, ksize=3) # 使用Otsu阈值法处理图像 thresh = threshold_otsu(img_laplacian) binary = img_laplacian > thresh # 寻找图像中的局部极大值坐标 coords = peak_local_max(binary, min_distance=5, threshold_abs=0.3) # 将坐标写入文本文件 with open('coordinates.txt', 'w') as f: for coord in coords: f.write('{} {}\n'.format(coord[1], coord[0]))
有效增强方案
针对原子圆形边界的提取需求,推荐以下几种针对性方法:
1. 自适应阈值+形态学轮廓提取
先解决背景不均问题,再通过形态学操作净化区域,最后提取轮廓:
import cv2 import numpy as np # 读取图像 img = cv2.imread('input_image.tif', cv2.IMREAD_GRAYSCALE) # 中值滤波去噪 img_denoised = cv2.medianBlur(img, 3) # 自适应阈值分割,突出原子区域(INV模式反转黑白) binary = cv2.adaptiveThreshold( img_denoised, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2 ) # 椭圆结构元,适配原子圆形特征 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)) # 闭操作填充原子区域小空洞,开操作去除背景噪声点 binary_clean = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) binary_clean = cv2.morphologyEx(binary_clean, cv2.MORPH_OPEN, kernel) # 提取外层轮廓 contours, _ = cv2.findContours(binary_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 在原图上绘制绿色轮廓(线宽1) img_contours = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) cv2.drawContours(img_contours, contours, -1, (0,255,0), 1) cv2.imwrite('atom_contours.tif', img_contours)
2. 小波去噪+Canny边缘检测
小波变换能在保留细节的同时高效抑制噪声,再结合Canny提取精准边缘:
import cv2 import numpy as np import pywt # 读取图像 img = cv2.imread('input_image.tif', cv2.IMREAD_GRAYSCALE) # db4小波分解2层,分离高低频系数 coeffs = pywt.wavedec2(img, 'db4', level=2) # 对高频系数做软阈值去噪(阈值30可根据噪声强度调整) coeffs[1] = tuple([pywt.threshold(c, value=30, mode='soft') for c in coeffs[1]]) coeffs[2] = tuple([pywt.threshold(c, value=30, mode='soft') for c in coeffs[2]]) # 重构去噪后的图像 img_denoised = pywt.waverec2(coeffs, 'db4') # 转换为uint8格式 img_denoised = np.uint8(img_denoised) # Canny边缘检测,高低阈值可根据图像对比度调整 edges = cv2.Canny(img_denoised, 50, 150) cv2.imwrite('atom_edges.tif', edges)
3. 霍夫圆检测(针对圆形原子)
利用霍夫变换直接检测圆形边界,适配原子的几何特征:
import cv2 import numpy as np # 读取图像 img = cv2.imread('input_image.tif', cv2.IMREAD_GRAYSCALE) # 5x5中值滤波,更强去噪适配圆检测 img_denoised = cv2.medianBlur(img, 5) # 霍夫圆检测参数说明: # dp=1:分辨率比例;minDist=10:圆中心最小距离; # param1=50:Canny高阈值;param2=30:累加器阈值; # minRadius/maxRadius:原子半径范围(需根据实际尺寸调整) circles = cv2.HoughCircles( img_denoised, cv2.HOUGH_GRADIENT, 1, minDist=10, param1=50, param2=30, minRadius=2, maxRadius=10 ) if circles is not None: circles = np.uint16(np.around(circles)) img_circles = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) for circle in circles[0,:]: # 绘制圆边界(绿色,线宽1) cv2.circle(img_circles, (circle[0], circle[1]), circle[2], (0,255,0), 1) cv2.imwrite('atom_circles.tif', img_circles)
参数调整提示
- 去噪环节:中值滤波核大小(3/5)、小波阈值需根据噪声颗粒大小调整;
- 轮廓/边缘检测:自适应阈值窗口大小、Canny高低阈值、霍夫圆的半径范围,需匹配图像中原子的实际尺寸和对比度;
- 形态学操作:结构元选择椭圆更适配圆形原子,核大小可根据原子尺寸微调。
内容的提问来源于stack exchange,提问作者Kickstarter
相关产品推荐
相关产品推荐

