本文目录导读:

我来为您介绍使用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中主要的滤波方法,您可以根据具体需求选择合适的滤波器。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播