OpenCV 图像处理实战:滤波、边缘检测与形态学操作
一、图像滤波(平滑处理)
图像滤波用于消除噪声或模糊细节,常用方法:
-
均值滤波
用邻域像素平均值替换中心像素值:
$$ I'(x,y) = \frac{1}{k^2} \sum_{i=-a}^{a} \sum_{j=-b}^{b} I(x+i,y+j) $$import cv2 img = cv2.imread('image.jpg') blur = cv2.blur(img, (5,5)) # 5x5 均值滤波核 -
高斯滤波
加权平均,中心权重最高:
$$ G(x,y) = \frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}} $$gaussian = cv2.GaussianBlur(img, (5,5), 0) # 核大小5x5, σ自动计算
二、边缘检测
识别图像中物体边界:
-
Sobel算子
计算梯度近似值:
$ G_x = \begin{bmatrix} -1 & 0 & 1 \ -2 & 0 & 2 \ -1 & 0 & 1 \end{bmatrix} * I $
$ G_y = \begin{bmatrix} -1 & -2 & -1 \ 0 & 0 & 0 \ 1 & 2 & 1 \end{bmatrix} * I $sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) # x方向 sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) # y方向 -
Canny边缘检测
四步流程:噪声抑制→梯度计算→非极大值抑制→双阈值检测edges = cv2.Canny(img, 100, 200) # 低阈值100, 高阈值200
三、形态学操作
处理二值图像的形状特征:
| 操作 | 数学定义 | 效果 |
|---|---|---|
| 腐蚀 | $ A \ominus B = {z \mid (B)_z \subseteq A} $ | 缩小前景区域 |
| 膨胀 | $ A \oplus B = {z \mid (\hat{B})_z \cap A \neq \emptyset} $ | 扩大前景区域 |
| 开运算 | $ A \circ B = (A \ominus B) \oplus B $ | 消除细小噪点 |
| 闭运算 | $ A \bullet B = (A \oplus B) \ominus B $ | 填充细小孔洞 |
kernel = np.ones((3,3), np.uint8) # 3x3结构元素
# 腐蚀与膨胀
erosion = cv2.erode(img, kernel, iterations=1)
dilation = cv2.dilate(img, kernel, iterations=1)
# 开闭运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
四、综合实战示例
import cv2
import numpy as np
# 1. 读取并预处理
img = cv2.imread('input.jpg', 0) # 灰度读取
img = cv2.GaussianBlur(img, (5,5), 0)
# 2. 边缘检测
edges = cv2.Canny(img, 50, 150)
# 3. 形态学优化
kernel = np.ones((3,3), np.uint8)
clean_edges = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)
# 4. 结果可视化
cv2.imshow('Original', img)
cv2.imshow('Edge Detection', clean_edges)
cv2.waitKey(0)
关键提示:
- 滤波核尺寸越大,平滑效果越强但细节损失越多
- Canny阈值需根据图像动态调整(建议低阈值:高阈值≈1:2或1:3)
- 形态学操作中,结构元素形状影响处理效果(圆形/十字形等)

被折叠的 条评论
为什么被折叠?



