本文目录导读:

我来为您介绍使用OpenCV进行图像滤波的Python案例,涵盖几种常见的滤波方法:
环境准备
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('image.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换颜色空间用于显示
均值滤波(平滑去噪)
def mean_filter_demo():
"""均值滤波 - 最简单的高斯平滑"""
# ksize必须为奇数
kernel_size = 5
mean_filtered = cv2.blur(img, (kernel_size, kernel_size))
# 或者使用boxFilter
box_filtered = cv2.boxFilter(img, -1, (5, 5))
return mean_filtered
# 显示结果
mean_result = mean_filter_demo()
plt.imshow(cv2.cvtColor(mean_result, cv2.COLOR_BGR2RGB))'均值滤波')
plt.show()
高斯滤波
def gaussian_filter_demo():
"""高斯滤波 - 更自然的平滑效果"""
# sigmaX: X方向标准差
gaussian = cv2.GaussianBlur(img, (5, 5), sigmaX=1.0)
# 不同参数对比
gaussian_smooth = cv2.GaussianBlur(img, (11, 11), sigmaX=2.0)
return gaussian, gaussian_smooth
中值滤波 - 去椒盐噪声
def median_filter_demo():
"""中值滤波 - 有效去除椒盐噪声"""
# 添加椒盐噪声
noisy_img = add_salt_pepper_noise(img, noise_ratio=0.05)
# 中值滤波
median = cv2.medianBlur(noisy_img, 5) # 核大小必须为奇数
return noisy_img, median
def add_salt_pepper_noise(image, noise_ratio=0.05):
"""添加椒盐噪声"""
h, w = image.shape[:2]
noise_mask = np.random.random((h, w))
noisy = image.copy()
# 椒噪声(白点)
noisy[noise_mask < noise_ratio/2] = 255
# 盐噪声(黑点)
noisy[noise_mask > 1 - noise_ratio/2] = 0
return noisy
双边滤波 - 保留边缘的去噪
def bilateral_filter_demo():
"""双边滤波 - 保留边缘的同时去噪"""
# d: 滤波直径
# sigmaColor: 颜色空间标准差
# sigmaSpace: 坐标空间标准差
bilateral = cv2.bilateralFilter(img, d=15, sigmaColor=75, sigmaSpace=75)
return bilateral
图像锐化
def sharpen_filter_demo():
"""图像锐化 - 使用自定义核"""
# 拉普拉斯算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian = np.uint8(np.absolute(laplacian))
# 自定义锐化核
kernel = np.array([[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1]])
sharpened = cv2.filter2D(img, -1, kernel)
return laplacian, sharpened
完整案例:图像滤波比较
def filter_comparison():
"""比较不同滤波效果"""
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
# 原始图像
axes[0, 0].imshow(img_rgb)
axes[0, 0].set_title('原始图像')
axes[0, 0].axis('off')
# 均值滤波
mean = cv2.blur(img, (5, 5))
axes[0, 1].imshow(cv2.cvtColor(mean, cv2.COLOR_BGR2RGB))
axes[0, 1].set_title('均值滤波 (5x5)')
axes[0, 1].axis('off')
# 高斯滤波
gaussian = cv2.GaussianBlur(img, (5, 5), 1.0)
axes[0, 2].imshow(cv2.cvtColor(gaussian, cv2.COLOR_BGR2RGB))
axes[0, 2].set_title('高斯滤波 (5x5)')
axes[0, 2].axis('off')
# 中值滤波
median = cv2.medianBlur(img, 5)
axes[1, 0].imshow(cv2.cvtColor(median, cv2.COLOR_BGR2RGB))
axes[1, 0].set_title('中值滤波 (5x5)')
axes[1, 0].axis('off')
# 双边滤波
bilateral = cv2.bilateralFilter(img, 15, 75, 75)
axes[1, 1].imshow(cv2.cvtColor(bilateral, cv2.COLOR_BGR2RGB))
axes[1, 1].set_title('双边滤波')
axes[1, 1].axis('off')
# 锐化
kernel = np.array([[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1]])
sharpened = cv2.filter2D(img, -1, kernel)
axes[1, 2].imshow(cv2.cvtColor(sharpened, cv2.COLOR_BGR2RGB))
axes[1, 2].set_title('图像锐化')
axes[1, 2].axis('off')
plt.tight_layout()
plt.show()
# 运行比较
filter_comparison()
自定义滤波核
def custom_filter_demo():
"""使用自定义滤波核"""
# 边缘检测核
edge_kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
# 模糊核
blur_kernel = np.ones((5, 5), np.float32) / 25
# 应用自定义核
edge_detected = cv2.filter2D(img, -1, edge_kernel)
blurred = cv2.filter2D(img, -1, blur_kernel)
return edge_detected, blurred
实用技巧
def filter_tips():
"""滤波实用技巧"""
# 1. 自适应阈值配合滤波
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 先高斯模糊再自适应阈值
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
adaptive_thresh = cv2.adaptiveThreshold(
blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
# 2. 形态学滤波(开运算去噪)
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)
# 3. 非局部均值去噪(高级去噪)
denoised = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
return adaptive_thresh, opening, denoised
性能优化建议
def filter_performance():
"""滤波性能优化"""
# 1. 使用较小的核以提高速度
# 2. 先缩小图像再滤波
h, w = img.shape[:2]
small_img = cv2.resize(img, (w//2, h//2))
# 在缩小图像上滤波
small_filtered = cv2.GaussianBlur(small_img, (3, 3), 0)
# 3. 使用SepFilter2D进行可分离滤波
# 高斯滤波实际上就是可分离的
kernel_x = cv2.getGaussianKernel(5, 1.0)
kernel_y = cv2.getGaussianKernel(5, 1.0)
separated_filtered = cv2.sepFilter2D(img, -1, kernel_x, kernel_y)
return separated_filtered
主要应用场景
- 去噪处理:中值滤波适合椒盐噪声,高斯滤波适合高斯噪声
- 图像平滑:均值滤波可用于简单的模糊效果
- 边缘保留:双边滤波在去噪同时保留边缘细节
- 图像增强:锐化滤波增强边缘和细节
这些案例涵盖了OpenCV中主要的滤波方法,您可以根据具体需求选择合适的滤波器。