Python数字图像处理实战——基于OpenCV实现多种滤波器(附完整代码和结果图)

Python数字图像处理实战——基于OpenCV实现多种滤波器(附完整代码和结果图)


关于作者


作者:小白熊

作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。

联系邮箱:xbx3144@163.com

科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~



1 前言

  图像处理是计算机视觉中非常重要的一部分,而滤波器是用于增强图像、减少噪声、检测边缘等的核心工具。通过不同的滤波器,我们可以处理图像中的噪声、模糊和细节,从而让图像在后续的处理步骤中更加清晰和准确。在本文中,我们将基于OpenCV展示如何实现多种常见的滤波操作,包括:

  1. 均值滤波
  2. 高斯滤波
  3. 中值滤波
  4. 双边滤波
  5. 自适应滤波
  6. Sobel 边缘检测
  7. 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 总结

  本文演示了几种常见滤波器的使用方法及其处理效果。每种滤波器都有各自的优势和适用场景,在实际应用中,选择合适的滤波器能够有效提高图像处理的效果。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白熊_XBX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值