You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenCV的STEM/TEM图像原子边界增强技术咨询

TEM/STEM图像原子边界增强方案

问题背景

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

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:47:52