第三章:图像预处理基础——噪声、滤波与增强
各位同学,欢迎来到实战训练营的第三讲。今天我们要聊的,是SEM图像分析里最基础、但也最容易被忽视的一环——图像预处理。
说实话,我见过太多人一上来就扔进深度学习模型,结果噪声太大,缺陷根本识别不出来。嗯,这就像你拿一张糊了的照片去人脸识别,系统能认出来才怪。所以,预处理这一步,咱们得踏踏实实走一遍。
核心观点:预处理做得好,后续分析事半功倍。预处理做得糙,模型再强也白搭。
3.1 图像噪声类型:你遇到的SEM图为什么总是不干净?
先说说噪声。SEM图像里的噪声,说白了就是那些不该出现的像素点。我刚开始做半导体工艺那会儿,经常盯着屏幕怀疑人生——这到底是缺陷还是噪声?
常见的噪声主要有两种:
- 高斯噪声:每个像素点都受到随机干扰,幅度服从高斯分布。SEM图像里最常见,尤其是低剂量扫描时。
- 椒盐噪声:随机出现的一些纯白或纯黑的像素点,像撒了盐和胡椒。我遇到过因为探测器老化导致的椒盐噪声,那叫一个头疼。
我的经验:判断噪声类型有个土办法——看直方图。高斯噪声会让直方图变"胖",椒盐噪声会在两端出现尖峰。你试试看,很直观。
3.2 滤波去噪:三种常用方法,各有各的脾气
去噪的方法很多,但实战中我常用的就三种。每种都有它的适用场景,选错了反而坏事。
3.2.1 均值滤波
原理很简单:用邻域内像素的平均值代替中心像素。速度快,但副作用也明显——图像会变模糊。
import cv2
import numpy as np
# 均值滤波
img = cv2.imread('sem_defect.png', 0)
blurred = cv2.blur(img, (5, 5)) # 5x5核
注意:均值滤波对椒盐噪声效果很差。我曾经在一个项目里用均值滤波去椒盐噪声,结果噪声没去掉,边缘全糊了。后来换成中值滤波,问题才解决。
3.2.2 中值滤波
取邻域内像素的中位数。对椒盐噪声效果极好,而且能保留边缘信息。我个人习惯在SEM图像预处理第一步就用中值滤波。
# 中值滤波
median = cv2.medianBlur(img, 5) # 5x5邻域
3.2.3 高斯滤波
用高斯核做加权平均。对高斯噪声效果最好,也是我处理SEM图像最常用的方法。为什么?因为SEM图像的噪声大多符合高斯分布。
# 高斯滤波
gaussian = cv2.GaussianBlur(img, (5, 5), 1.0) # sigma=1.0
| 滤波方法 | 适用噪声 | 边缘保留 | 速度 | 我的推荐场景 |
|---|---|---|---|---|
| 均值滤波 | 均匀噪声 | 差 | 快 | 快速预览 |
| 中值滤波 | 椒盐噪声 | 好 | 中等 | 探测器噪声修复 |
| 高斯滤波 | 高斯噪声 | 较好 | 中等 | SEM常规预处理 |
3.3 直方图均衡化:让暗区的缺陷"现原形"
SEM图像经常出现一个问题:某些区域太暗,缺陷根本看不清。这时候直方图均衡化就派上用场了。
原理其实不复杂——把像素值的分布拉得更均匀。原来集中在暗区的像素,会被"拉伸"到整个亮度范围。你想想看,原本藏在暗处的缺陷,一下子就暴露了。
# 直方图均衡化
equ = cv2.equalizeHist(img)
# 自适应直方图均衡化(效果更好)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
避坑指南:我曾经直接对整张SEM图做全局直方图均衡化,结果背景噪声被放大了,缺陷反而更难识别。后来改用自适应直方图均衡化(CLAHE),效果好了很多。记住,SEM图像往往光照不均匀,局部处理比全局处理更靠谱。
3.4 图像增强:不止是"调亮"那么简单
图像增强听起来像美颜,但在SEM分析里,它是实打实的"缺陷放大镜"。常用的方法包括:
- 对比度拉伸:把像素值映射到更大的范围。比如原来0-100的灰度,拉伸到0-255。
- 锐化:增强边缘信息。我用的是拉普拉斯算子,效果直接。
- 伽马校正:调整图像的亮度分布。伽马值小于1,暗部变亮;大于1,亮部变暗。
# 对比度拉伸
def contrast_stretch(img):
min_val, max_val = np.min(img), np.max(img)
stretched = (img - min_val) * (255.0 / (max_val - min_val))
return np.uint8(stretched)
# 拉普拉斯锐化
laplacian = cv2.Laplacian(img, cv2.CV_64F)
sharpened = cv2.addWeighted(img, 1.5, laplacian, -0.5, 0)
# 伽马校正
gamma = 0.8
gamma_corrected = np.power(img / 255.0, gamma) * 255.0
实战建议:预处理流程不是固定的。我一般会先做中值滤波去椒盐噪声,然后高斯滤波平滑,最后用CLAHE增强对比度。但具体怎么调,得看你的SEM图像质量。多试几次,找到最适合你数据集的组合。
好了,这一章的内容就到这里。预处理是SEM图像分析的地基,地基打不牢,后面再好的算法也白搭。下一章我们会聊特征提取,到时候这些预处理技巧都会用上。
公众号:蓝海资料掘金营,微信deep3321