Python案例如何用OpenCV做图像滤波

wen python案例 2

本文目录导读:

Python案例如何用OpenCV做图像滤波

  1. 环境准备
  2. 均值滤波(平滑去噪)
  3. 高斯滤波
  4. 中值滤波 - 去椒盐噪声
  5. 双边滤波 - 保留边缘的去噪
  6. 图像锐化
  7. 完整案例:图像滤波比较
  8. 自定义滤波核
  9. 实用技巧
  10. 性能优化建议
  11. 主要应用场景

我来为您介绍使用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

主要应用场景

  1. 去噪处理:中值滤波适合椒盐噪声,高斯滤波适合高斯噪声
  2. 图像平滑:均值滤波可用于简单的模糊效果
  3. 边缘保留:双边滤波在去噪同时保留边缘细节
  4. 图像增强:锐化滤波增强边缘和细节

这些案例涵盖了OpenCV中主要的滤波方法,您可以根据具体需求选择合适的滤波器。

抱歉,评论功能暂时关闭!