图像增强常用算子代码示例——均值滤波、中值滤波、梯度算子、拉普拉斯算子、Sobel算子、Prewitt算子、Canny算子
【代码】图像增强常用算子代码示例——均值滤波、中值滤波、梯度算子、拉普拉斯算子、Sobel算子、Prewitt算子、Canny算子。
·
需要安装这些库:
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=∂x2∂2f+∂y2∂2f | 图像锐化,增强细节,但对噪声敏感 |
| Sobel 算子 | 结合平滑和一阶差分的梯度算子 | 卷积核:[−101−202−101]\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix} −1−2−1000121 | 提取边缘,抗噪性好 |
| Prewitt 算子 | 简化版梯度算子,计算更快 | 卷积核:[−101−101−101]\begin{bmatrix}-1&0&1\\-1&0&1\\-1&0&1\end{bmatrix} −1−1−1000111 | 检测边缘,精度稍低于 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πσ21e−2σ2x2+y2 | 最优边缘检测,边缘连续、细致 |
- 平滑滤波 → 降噪(模糊或保边缘) eg. 中值,均值滤波
- 锐化滤波 → 突出边缘与细节(但可能放大噪声)eg. 梯度算子,拉普拉斯算子
- 边缘检测 → 明确目标边界 eg. Sobel, Prewitt, Canny(Canny 最细节)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)