计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作
本文系统介绍了图像预处理的三大核心技术:滤波(高斯、中值、双边)、边缘检测(Sobel、Canny、Laplacian)和形态学操作(膨胀、腐蚀、开闭运算)。通过原理讲解、公式展示、Python代码实现和可视化效果,详细解析了不同算法的特点及适用场景。特别针对OCR等实际应用场景,提供了完整的预处理流水线方案,包括高斯去噪、形态学增强、Sobel梯度提取等关键步骤。文章强调这些基础技术在传统CV和
关键词:高斯滤波、Sobel、Canny、膨胀、腐蚀、开闭运算、OpenCV、Python
一、写在前面:为什么必须掌握“老三件”?
无论做传统 CV 还是深度学习,图像预处理永远绕不开三件事:
-
滤波:去噪、平滑、保留结构;
-
边缘检测:提取轮廓、降低维度;
-
形态学:基于形状的后处理(孔洞填充、分离粘连、骨架提取)。
本文用“原理 + 公式 + 代码 + 可视化”的四段式,一次性带你吃透它们,并为后续特征提取、语义分割、OCR 等任务打下坚实基础。
二、滤波:降噪与保边的艺术
2.1 线性滤波器:均值、高斯、方框
表格
复制
类型 | 核示例 | 特点 |
---|---|---|
均值 | 3×3 全 1/9 | 简单、易模糊 |
方框 | 任意尺寸全 1/(w·h) | 可分离、速度快 |
高斯 | 高斯权重 | 边缘保留更好 |
import cv2
img = cv2.imread('lena.png')
blur = cv2.GaussianBlur(img, (5,5), sigmaX=1.5)
2.2 非线性滤波器:中值、双边
-
中值滤波:对椒盐噪声无敌,
cv2.medianBlur(img, 5)
-
双边滤波:空域 + 值域加权,保边去
bi = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)
2.3 可分离卷积加速
高斯核可拆成行、列两次一维卷积,复杂度从 O(n²) → O(n)。
三、边缘检测:一阶导 or 二阶导?
3.1 梯度算子家族
算子 | 模板 | 特点 |
---|---|---|
Sobel | [-1 0 1] & [-1 -2 -1]^T | 对噪声有一定抑制 |
Scharr | 3×3 更精细 | 旋转不变性更好 |
Prewitt | 类似 Sobel | 计算简单 |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
dy = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)
mag = cv2.magnitude(dx, dy)
3.2 Canny 四部曲
-
高斯平滑
-
梯度幅值/方向
-
非极大值抑制
-
双阈值 + 滞后跟踪
一行代码搞定:
edge = cv2.Canny(gray, threshold1=50, threshold2=150)
3.3 Laplacian & LoG
-
Laplacian:二阶导、零交叉;
-
LoG:先高斯再 Laplacian,抗噪。
四、形态学:基于集合的图像“修理术”
4.1 基本操作:膨胀 & 腐蚀
-
腐蚀(Erode):缩小前景、断开细线
-
膨胀(Dilate):扩大前景、连接断裂
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
eroded = cv2.erode(gray, kernel, iterations=1)
dilated = cv2.dilate(gray, kernel, iterations=1)
4.2 复合操作:开、闭、梯度、顶帽、黑帽
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
4.3 自定义核与灰度/彩色形态学
六、性能与调参锦囊
场景 | 推荐组合 |
---|---|
强高斯噪声 | 高斯滤波(5,5,σ=1.2) → Canny |
椒盐噪声 | 中值滤波(3×3) → Sobel |
光照不均 | 顶帽 → 自适应阈值 |
文字断笔 | 闭运算(5×1) |
小目标 | 小核(3×3)多次膨胀 |
七、总结 & 延伸
完整代码(核心片段):
def ocr_preprocess(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
tophat = cv2.morphologyEx(blur, cv2.MORPH_TOPHAT,
cv2.getStructuringElement(cv2.MORPH_RECT,(30,9)))
grad = cv2.Sobel(tophat, cv2.CV_8U, 0, 1, ksize=3)
_, th = cv2.threshold(grad, 0, 255, cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(20,5))
closed = cv2.morphologyEx(th, cv2.MORPH_CLOSE, kernel)
return closed
-
核形状:矩形、椭圆、十字形
-
灰度:直接对 0-255 操作;
-
彩色:可逐通道或转到 HSV 仅处理 V。
五、综合实战:OCR 预处理流水线示例
需求:读取倾斜银行卡号 → 识别数字。
-
灰度化 + 高斯滤波
-
顶帽操作增强字与背景对比
-
Sobel Y 方向梯度突出竖直笔画
-
自适应阈值 → 二值化
-
闭运算连接断笔
-
Canny 边缘 + 轮廓检测 → 透视校正
-
Tesseract OCR 识别
-
滤波:决定“去噪 vs 保边”的平衡;
-
边缘:一阶快、二阶准,Canny 仍是工业默认;
-
形态学:用集合思想“修修补补”,在分割/文档/医学影像中无处不在。
更多推荐
所有评论(0)