需要安装这些库:

pip install -U numpy matplotlib scikit-image

1. 均值滤波

# --- 均值滤波 ---
mean_blur = cv2.blur(img, (5,5))

plt.figure(figsize=(8,4))
plt.subplot(1,2,1), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(1,2,2), plt.imshow(mean_blur, cmap="gray"), plt.title("Mean Filter")
plt.show()

在这里插入图片描述

2. 中值滤波

# --- 中值滤波 ---
median_blur = cv2.medianBlur(img, 5)

plt.figure(figsize=(8,4))
plt.subplot(1,2,1), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(1,2,2), plt.imshow(median_blur, cmap="gray"), plt.title("Median Filter")
plt.show()

在这里插入图片描述

3. 梯度算子

# --- 梯度算子 (Sobel) ---
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobel = cv2.magnitude(sobel_x, sobel_y)

plt.figure(figsize=(8,4))
plt.subplot(1,2,1), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(1,2,2), plt.imshow(sobel, cmap="gray"), plt.title("Sobel Gradient")
plt.show()

在这里插入图片描述

4. Laplace算子

# --- 拉普拉斯算子 ---
laplacian = cv2.Laplacian(img, cv2.CV_64F)

plt.figure(figsize=(8,4))
plt.subplot(1,2,1), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(1,2,2), plt.imshow(laplacian, cmap="gray"), plt.title("Laplacian")
plt.show()

在这里插入图片描述

5. Sobel 算子

# --- Sobel 边缘检测 ---
sobel_edge = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)

plt.figure(figsize=(8,4))
plt.subplot(1,2,1), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(1,2,2), plt.imshow(sobel_edge, cmap="gray"), plt.title("Sobel Edge")
plt.show()

在这里插入图片描述

5. Prewitt 算子

# --- Prewitt 算子 ---
kernelx = np.array([[-1,0,1],[-1,0,1],[-1,0,1]], dtype=np.float32)
kernely = np.array([[-1,-1,-1],[0,0,0],[1,1,1]], dtype=np.float32)
prewitt_x = cv2.filter2D(img, -1, kernelx)
prewitt_y = cv2.filter2D(img, -1, kernely)
prewitt = cv2.magnitude(np.float32(prewitt_x), np.float32(prewitt_y))

plt.figure(figsize=(8,4))
plt.subplot(1,2,1), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(1,2,2), plt.imshow(prewitt, cmap="gray"), plt.title("Prewitt Edge")
plt.show()

在这里插入图片描述

6. Canny 算子

# --- Canny 算子 ---
canny = cv2.Canny(img, 100, 200)

plt.figure(figsize=(8,4))
plt.subplot(1,2,1), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(1,2,2), plt.imshow(canny, cmap="gray"), plt.title("Canny Edge")
plt.show()

在这里插入图片描述


小结

方法 原理 数学公式 典型效果
均值滤波 (Mean Filter) 用邻域内像素的平均值替代中心像素,低通滤波 g(x,y)=1mn∑(s,t)∈Wf(s,t)g(x,y) = \frac{1}{mn}\sum_{(s,t)\in W} f(s,t)g(x,y)=mn1(s,t)Wf(s,t) 去噪声,模糊细节
中值滤波 (Median Filter) 取邻域内的中值替代中心像素,非线性滤波 g(x,y)=median{f(s,t)∣(s,t)∈W}g(x,y) = \text{median}\{ f(s,t)\mid (s,t)\in W \}g(x,y)=median{f(s,t)(s,t)W} 去椒盐噪声,保留边缘较好
梯度算子 (Sobel/一阶导数) 利用灰度变化率(差分近似)检测边缘 G=Gx2+Gy2G = \sqrt{G_x^2 + G_y^2}G=Gx2+Gy2 ,其中 Gx=f(x+1,y)−f(x,y)G_x=f(x+1,y)-f(x,y)Gx=f(x+1,y)f(x,y) 突出边缘,增强细节
拉普拉斯算子 (Laplacian/二阶导数) 计算灰度的二阶变化,增强局部突变 ∇2f=∂2f∂x2+∂2f∂y2\nabla^2 f = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}2f=x22f+y22f 图像锐化,增强细节,但对噪声敏感
Sobel 算子 结合平滑和一阶差分的梯度算子 卷积核:[−101−202−101]\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix} 121000121 提取边缘,抗噪性好
Prewitt 算子 简化版梯度算子,计算更快 卷积核:[−101−101−101]\begin{bmatrix}-1&0&1\\-1&0&1\\-1&0&1\end{bmatrix} 111000111 检测边缘,精度稍低于 Sobel
Canny 算子 多步骤边缘检测:高斯滤波 → 梯度计算 → 非极大值抑制 → 双阈值连接 梯度计算 + 高斯滤波公式 G(x,y)=12πσ2e−x2+y22σ2G(x,y) = \frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}}G(x,y)=2πσ21e2σ2x2+y2 最优边缘检测,边缘连续、细致
  • 平滑滤波 → 降噪(模糊或保边缘) eg. 中值,均值滤波
  • 锐化滤波 → 突出边缘与细节(但可能放大噪声)eg. 梯度算子,拉普拉斯算子
  • 边缘检测 → 明确目标边界 eg. Sobel, Prewitt, Canny(Canny 最细节)
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐