关键词:高斯滤波、Sobel、Canny、膨胀、腐蚀、开闭运算、OpenCV、Python

一、写在前面:为什么必须掌握“老三件”?

无论做传统 CV 还是深度学习,图像预处理永远绕不开三件事:

  1. 滤波:去噪、平滑、保留结构;

  2. 边缘检测:提取轮廓、降低维度;

  3. 形态学:基于形状的后处理(孔洞填充、分离粘连、骨架提取)。

本文用“原理 + 公式 + 代码 + 可视化”的四段式,一次性带你吃透它们,并为后续特征提取、语义分割、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 四部曲

  1. 高斯平滑

  2. 梯度幅值/方向

  3. 非极大值抑制

  4. 双阈值 + 滞后跟踪

一行代码搞定:

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 仍是工业默认;

  • 形态学:用集合思想“修修补补”,在分割/文档/医学影像中无处不在。

Logo

惟楚有才,于斯为盛。欢迎来到长沙!!! 茶颜悦色、臭豆腐、CSDN和你一个都不能少~

更多推荐