OpenCV 之图像平滑处理

引言

图像平滑处理(也称为“模糊处理”)是计算机视觉中一项非常基础的技术,常用于减少图像噪声或失真,提高图像质量。平滑处理可以通过各种滤波器实现,常见的滤波器包括均值滤波、方框滤波、高斯滤波和中值滤波。本文将详细介绍这些滤波器的原理及其在 OpenCV 中的具体实现。

基础概念

图像平滑处理的基本思想是通过卷积操作来替换每个像素值,使其变为邻域内像素值的某种形式的加权平均值。这样可以有效地抑制高频噪声,使图像更加平滑。但是,过度的平滑也会导致图像细节的丢失,因此需要根据具体需求选择合适的滤波器和参数。

代码实现与演示
  1. 导入库和定义椒盐噪声函数

    1import cv2
    2import numpy as np
    3
    4def add_peppersalt_noise(img, n=10000):
    5    '''这个函数 add_peppersalt_noise 的目的是向给定的图像中添加椒盐噪声(Pepper & Salt Noise)。'''
    6    result = img.copy()
    7    h, w = img.shape[:2]
    8    for i in range(n):
    9        x = np.random.randint(1, h)
    10        y = np.random.randint(1, w)
    11        if np.random.randint(0, 2) == 0:
    12            result[x, y] = 0
    13        else:
    14            result[x, y] = 255
    15    return result

    解释:

    • 定义一个函数 add_peppersalt_noise 用于向图像中添加椒盐噪声。
    • 通过随机选择图像中的像素点,并将其设置为全黑(0)或全白(255),来模拟椒盐噪声。
  2. 读取图像并添加噪声

    1image = cv2.imread('picture_video/zl.png')
    2cv2.imshow('原图', image)
    3cv2.waitKey(0)
    4noise = add_peppersalt_noise(image)
    5cv2.imshow('噪声图', noise)
    6cv2.waitKey(0)

    解释:

    • 使用 cv2.imread 函数读取图像文件 zl.png
    • 显示原始图像,并等待用户按键继续。
    • 使用 add_peppersalt_noise 函数向图像中添加椒盐噪声,并显示噪声图像。
  3. 均值滤波

    1# 均值滤波
    2blur_1 = cv2.blur(noise, (3, 3))
    3cv2.imshow('均值滤波 (3, 3)', blur_1)
    4cv2.waitKey(0)
    5
    6blur_2 = cv2.blur(noise, (5, 5))
    7cv2.imshow('均值滤波 (5, 5)', blur_2)
    8cv2.waitKey(0)

    解释:

    • 使用 cv2.blur 函数进行均值滤波。
    • ksize=(3, 3) 表示使用 3x3 的卷积核,ksize=(5, 5) 表示使用 5x5 的卷积核。
    • 显示均值滤波后的图像,并等待用户按键继续。
  4. 方框滤波

    1# 方框滤波
    2boxFilter_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True)
    3cv2.imshow('方框滤波 (3, 3) 归一化', boxFilter_1)
    4cv2.waitKey(0)
    5
    6boxFilter_2 = cv2.boxFilter(noise, -1, (3, 3), normalize=False)
    7cv2.imshow('方框滤波 (3, 3) 不归一化', boxFilter_2)
    8cv2.waitKey(0)

    解释:

    • 使用 cv2.boxFilter 函数进行方框滤波。
    • ddepth=-1 表示输出图像的深度与输入图像相同。
    • normalize=True 表示归一化处理,normalize=False 表示不归一化处理。
    • 显示方框滤波后的图像,并等待用户按键继续。
  5. 高斯滤波

    1# 高斯滤波
    2GaussianB = cv2.GaussianBlur(noise, (3, 3), 1)
    3cv2.imshow('高斯滤波 (3, 3) 标准差=1', GaussianB)
    4cv2.waitKey(0)

    解释:

    • 使用 cv2.GaussianBlur 函数进行高斯滤波。
    • ksize=(3, 3) 表示使用 3x3 的高斯核,sigmaX=1 表示 X 方向的标准差为 1。
    • 显示高斯滤波后的图像,并等待用户按键继续。       
  6. 中值滤波

    1# 中值滤波
    2medianB = cv2.medianBlur(noise, 5)
    3cv2.imshow('中值滤波 (5)', medianB)
    4cv2.waitKey(0)
    5cv2.destroyAllWindows()

    解释:

    • 使用 cv2.medianBlur 函数进行中值滤波。
    • ksize=5 表示使用 5x5 的滤波核。
    • 显示中值滤波后的图像,并等待用户按键继续。        
总结

通过上述代码演示,我们展示了 OpenCV 中几种常用的图像平滑处理方法:均值滤波、方框滤波、高斯滤波和中值滤波。这些方法各有特点,适用于不同的应用场景。均值滤波和方框滤波较为简单,适用于一般的噪声抑制;高斯滤波保留更多细节的同时也能有效去除噪声;中值滤波对于椒盐噪声尤其有效。选择合适的滤波器和参数,可以大大提高图像处理的效果。

  • 23
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值