Python数字图像处理实战——基于OpenCV实现多种滤波器(附完整代码和结果图)
关于作者
作者:小白熊
作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。
联系邮箱:xbx3144@163.com
科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~
1 前言
图像处理是计算机视觉中非常重要的一部分,而滤波器是用于增强图像、减少噪声、检测边缘等的核心工具。通过不同的滤波器,我们可以处理图像中的噪声、模糊和细节,从而让图像在后续的处理步骤中更加清晰和准确。在本文中,我们将基于OpenCV展示如何实现多种常见的滤波操作,包括:
- 均值滤波
- 高斯滤波
- 中值滤波
- 双边滤波
- 自适应滤波
- Sobel 边缘检测
- Scharr 滤波
2 代码实现
2.1 导入所需库
首先我们导入一些常用的库,如 OpenCV
用于图像处理,Matplotlib
用于结果可视化。
import cv2
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")# 配置Matplotlib显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
2.2 均值滤波
均值滤波是一种简单的平滑滤波,它通过取周围像素的平均值来减小图像中的噪声。均值滤波的效果较为温和,适合用于去除随机噪声。
mean_filter = cv2.blur(img, (5, 5))
2.3 高斯滤波
高斯滤波是一种常用的平滑滤波器,它使用高斯函数对邻域内的像素进行加权平均,能够较好地去除图像中的高斯噪声,同时保持图像边缘的细节。
gaussian_filter = cv2.GaussianBlur(img, (5, 5), 0)
2.4 中值滤波
中值滤波是非线性滤波的一种,特别适用于去除椒盐噪声。它通过选取邻域中的中值代替中心像素,能够在保留边缘的同时去除噪声。
median_filter = cv2.medianBlur(img, 5)
2.5 双边滤波
双边滤波在去除噪声的同时能够很好地保留边缘细节。它根据像素间的空间距离和颜色差异进行加权平均,是一种非常适合图像增强的滤波方法。
bilateral_filter = cv2.bilateralFilter(img, 9, 75, 75)
2.6 自适应滤波
自适应滤波是一种根据图像局部特征动态调整滤波方式的滤波器。在本例中,我们使用自适应阈值滤波对图像进行二值化处理,适合处理光照不均匀的图像。
adaptive_filter = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
2.7 Sobel 边缘检测滤波
Sobel 滤波是经典的边缘检测方法,通过计算图像的梯度来提取边缘信息。Sobel 滤波器可以分别检测水平和垂直方向的边缘,最终将它们结合,得到完整的边缘图。
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
sobel_filter = np.hypot(sobelx, sobely)
2.8 Scharr 滤波
Scharr 滤波是一种增强版的Sobel滤波器,在边缘检测时有更高的精度和更好的效果,尤其是在检测细微的边缘时表现更出色。
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharr_filter = np.hypot(scharrx, scharry)
3 完整代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import wiener
from skimage import restoration
import warnings
warnings.filterwarnings("ignore")plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 读取原始图像
img = cv2.imread('messi.jpg', cv2.IMREAD_GRAYSCALE)# 均值滤波
mean_filter = cv2.blur(img, (5, 5))# 高斯滤波
gaussian_filter = cv2.GaussianBlur(img, (5, 5), 0)# 中值滤波
median_filter = cv2.medianBlur(img, 5)# 双边滤波
bilateral_filter = cv2.bilateralFilter(img, 9, 75, 75)# 自适应滤波(自适应阈值滤波)
adaptive_filter = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)# Sobel 边缘检测滤波
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
sobel_filter = np.hypot(sobelx, sobely) # 计算梯度幅度# Scharr 滤波
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharr_filter = np.hypot(scharrx, scharry)# 创建子图来显示结果
plt.figure(figsize=(15, 15))# 显示原始图像
plt.subplot(3, 3, 1)
plt.imshow(img, cmap='gray')
plt.title('原始图片')
plt.axis('off')# 均值滤波
plt.subplot(3, 3, 2)
plt.imshow(mean_filter, cmap='gray')
plt.title('均值滤波')
plt.axis('off')# 高斯滤波
plt.subplot(3, 3, 3)
plt.imshow(gaussian_filter, cmap='gray')
plt.title('高斯滤波')
plt.axis('off')# 中值滤波
plt.subplot(3, 3, 4)
plt.imshow(median_filter, cmap='gray')
plt.title('中值滤波')
plt.axis('off')# 双边滤波
plt.subplot(3, 3, 5)
plt.imshow(bilateral_filter, cmap='gray')
plt.title('双边滤波')
plt.axis('off')# 自适应滤波
plt.subplot(3, 3, 6)
plt.imshow(adaptive_filter, cmap='gray')
plt.title('自适应滤波')
plt.axis('off')# Sobel 滤波
plt.subplot(3, 3, 7)
plt.imshow(sobel_filter, cmap='gray')
plt.title('Sobel 滤波')
plt.axis('off')# Scharr 滤波
plt.subplot(3, 3, 8)
plt.imshow(scharr_filter, cmap='gray')
plt.title('Scharr 滤波')
plt.axis('off')plt.tight_layout()
# 保存图像
plt.savefig('results.png')# 显示结果
plt.show()
结果图:
4 滤波器的选择
- 均值滤波:适合处理细微噪声,但可能模糊图像边缘。
- 高斯滤波:适合去除高斯噪声,具有更好的边缘保留能力。
- 中值滤波:适合去除椒盐噪声,保留边缘细节。
- 双边滤波:在平滑图像的同时保留边缘,是图像增强的理想选择。
- 自适应滤波:在光照变化较大的情况下,可以动态调整阈值处理图像。
- Sobel 和 Scharr 滤波:用于边缘检测,后者精度更高,适合处理细微的边缘。
5 总结
本文演示了几种常见滤波器的使用方法及其处理效果。每种滤波器都有各自的优势和适用场景,在实际应用中,选择合适的滤波器能够有效提高图像处理的效果。