图像去模糊中的均值滤波、高斯滤波、双边滤波简单介绍及代码演示

图像去模糊中的均值滤波、高斯滤波和双边滤波简单介绍

图像模糊是指图像中的细节和边缘被平滑和模糊化,通常是由于图像采集设备或者图像传输过程中的噪声和抖动引起的。为了恢复图像的细节和边缘,可以使用图像去模糊技术对模糊图像进行处理。本文将介绍一些常见的图像去模糊技术和它们的实现方法。

均值滤波

均值滤波是一种常见的线性滤波器,它通过用图像局部区域的像素平均值替换中心像素来减小噪声和细节。在均值滤波中,每个像素的值被替换为它周围像素的平均值。均值滤波器的大小通常是一个正方形或矩形,大小从 3x3 到 15x15 不等。均值滤波器的大小越大,图像的平滑程度越高,但是细节和边缘也会被更多地模糊化。

在 OpenCV 中,可以使用 cv2.blur 函数或者 cv2.boxFilter 函数来实现均值滤波。例如,以下代码演示了如何使用 cv2.blur 函数对图像进行均值滤波:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读入图像
img = cv2.imread('img.png')

# 对图像进行均值模糊处理
blur = cv2.blur(img, (5, 5))

# 在 Matplotlib 中创建子图,分别显示原始图像和模糊图像
plt.subplot(1, 2, 1)
plt.imshow(img, cmap='gray')
plt.title('sharp image')
plt.subplot(1, 2, 2)
plt.imshow(blur, cmap='gray')
plt.title('blur image')

# 将显示的图像保存到文件中,并设置分辨率为 300 dpi
plt.savefig('save.png', dpi=300)

# 显示图像
plt.show()

在这个代码中,cv2.blur 函数接受两个参数,第一个参数是待滤波的图像,第二个参数是滤波器的大小。在这个例子中,我们使用了一个大小为 5x5 的滤波器对图像进行了均值滤波。

虽说是滤波,但是你是用高清图片会变模糊的。生成的图片效果如下所示。

在这里插入图片描述

cmap 是 Matplotlib 库中用于指定颜色映射的参数。在 plt.imshow 函数中,它用于指定显示图像时使用的颜色映射。如果不指定 cmap 参数,则默认使用颜色映射 viridis。在 gray 颜色映射中,灰度图像中的每个像素值都被映射到一个对应的灰色和黑色的颜色值之间。

在参数 cmap 中,可以指定多个不同的颜色映射。除了 gray 之外,常用的颜色映射包括:

  • viridis:一种从蓝色到黄色的颜色映射,用于表示数据值的大小或者密度。
  • jet:一种从蓝色到红色的颜色映射,用于表示数据值的大小或者密度。
  • hot:一种从黑色到红色的颜色映射,用于表示数据值的大小或者密度。
  • cool:一种从青色到红色的颜色映射,用于表示数据值的大小或者密度。
  • rainbow:一种七色彩虹色的颜色映射,用于表示数据值的大小或者密度。

高斯滤波

高斯滤波是一种常见的线性滤波器,它通过对图像进行加权平均来减小噪声和细节。和均值滤波不同,高斯滤波使用的权重是高斯函数。在高斯滤波中,像素的值被替换为它周围像素的加权平均值,权重由高斯函数计算得出。高斯滤波器的大小通常是一个正方形或矩形,大小从 3x3 到 15x15 不等。高斯滤波器的大小越大,图像的平滑程度越高,但是细节和边缘也会被更多地模糊化。

在 OpenCV 中,可以使用 cv2.GaussianBlur 函数来实现高斯滤波。例如,以下代码演示了如何使用 cv2.GaussianBlur 函数对图像进行高斯滤波:

import cv2
import matplotlib.pyplot as plt

# 读入图像
img = cv2.imread('img.png')

# 对图像进行高斯模糊处理
blur = cv2.GaussianBlur(img, (5, 5), 0)

# 在 Matplotlib 中创建子图,分别显示原始图像和模糊图像
plt.subplot(1, 2, 1)
plt.imshow(img, cmap='gray')
plt.title('sharp image')
plt.subplot(1, 2, 2)
plt.imshow(blur, cmap='gray')
plt.title('blur image')

# 将显示的图像保存到文件中,并设置分辨率为 300 dpi
plt.savefig('gauss_img.png', dpi=300)

# 显示图像
plt.show()

在这个代码中,cv2.GaussianBlur 函数接受三个参数,第一个参数是待滤波的图像,第二个参数是滤波器的大小,第三个参数是高斯函数的标准差。在这个例子中,我们使用了一个大小为 5x5 的滤波器和标准差为 0 的高斯函数对图像进行了高斯滤波。

在这里插入图片描述

cv2.GaussianBlur() 是 OpenCV 中用于进行高斯滤波的函数,其语法如下:

dst = cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])

其中,各参数的含义如下:

  • src:输入图像,可以是单通道或多通道图像,数据类型为 uint8float32
  • ksize:高斯核的大小,可以使用 (width, height) 来指定,也可以使用一个正整数来表示核的宽和高相等。核的大小必须是正且奇数。
  • sigmaX:高斯核在 X 方向上的标准差,若值为 0,则根据核的大小自动计算标准差。
  • sigmaY:高斯核在 Y 方向上的标准差,若值为 0,则使用与 sigmaX 相同的值。
  • borderType:边界填充方式,可以取以下值之一:
    • cv2.BORDER_CONSTANT:常数填充,填充值由 value 参数指定。
    • cv2.BORDER_REPLICATE:复制边界像素值填充。
    • cv2.BORDER_REFLECT:反射边界填充。
    • cv2.BORDER_WRAP:环绕边界填充。
    • cv2.BORDER_REFLECT_101cv2.BORDER_DEFAULT:反射边界填充,但不包括边缘像素。
    • cv2.BORDER_TRANSPARENT:透明边界填充。

在这里的代码中,cv2.GaussianBlur() 函数对输入的图像 img 进行高斯模糊处理,使用了 (5, 5) 的 5x5 大小的高斯核, sigmaX 为 0,表示根据核的大小自动计算标准差。最终得到的模糊图像保存在 blur 中。

sigmaX 是高斯核在 X 方向上的标准差,用于控制高斯核函数的形状。它的取值越大,表示高斯函数在 X 方向上的分布越平缓,核的权重分布越广,模糊程度越大。反之,sigmaX 取值越小,表示高斯函数在 X 方向上的分布越陡峭,核的权重分布越集中,模糊程度越小。如果 sigmaX 设为 0,则会根据核的大小自动计算标准差,此时核的形状会根据核的大小自动调整。

需要注意的是,在进行高斯模糊时,sigmaX 的值与图像的特征尺度有关系。如果输入的图像中包含较细的纹理或者边缘,那么需要选择一个比较小的 sigmaX 值,以保留这些细节。如果输入的图像中包含较粗的结构或者噪声,那么需要选择一个较大的 sigmaX 值,以平滑图像并减少噪声。如果 sigmaX 的值过大,会导致图像过度模糊,使得图像失去细节。因此,在实际应用中,可以通过不断尝试不同的 sigmaX 值,来获得更好的高斯模糊效果。

双边滤波

双边滤波是一种非线性滤波器,它可以减小噪声和细节的同时保留图像的边缘。在双边滤波中,像素的值被替换为它周围像素的加权平均值,权重由像素之间的距离和像素之间的灰度差异共同决定。因此,双边滤波可以减小噪声和细节,同时保留图像的边缘和细节。

在 OpenCV 中,可以使用 cv2.bilateralFilter 函数来实现双边滤波。例如,以下代码演示了如何使用 cv2.bilateralFilter 函数对图像进行双边滤波:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('img.png')

blur = cv2.bilateralFilter(img, 9, 75, 75)

plt.subplot(1, 2, 1)
plt.imshow(img, cmap='cool')
plt.title('sharp image')
plt.subplot(1, 2, 2)
plt.imshow(blur, cmap='cool')
plt.title('blur image')
plt.savefig('bila_img.png', dpi=300)
plt.show()

在这个代码中,cv2.bilateralFilter 函数接受四个参数,第一个参数是待滤波的图像,第二个参数是滤波器的大小,第三个参数是像素值空间的标准差,第四个参数是像素值灰度差异的标准差。在这个例子中,我们使用了一个大小为 9 的滤波器和标准差为 75 的像素值空间和像素值灰度差异对图像进行了双边滤波。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3UwqJyU7-1683127902244)(E:\wang\Typora文档\csdn\图像重建\图像去模糊中的均值滤波、高斯滤波、双边滤波.assets\bila_img.png)]

总结

在本文中,我们介绍了图像去模糊的三种常见方法:均值滤波、高斯滤波和双边滤波。这些方法都是基于滤波器对图像像素进行加权平均来减小噪声和细节的。每种方法都有其优点和缺点,需要根据具体应用场景选择合适的方法。在实际应用中,可以通过调整滤波器的大小和参数来控制图像的平滑程度和细节保留程度。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这是一个关于图像滤波的问题,我可以为您简单介绍一下这四种滤波方法的特点和应用场景。 1. 均值滤波:是一种最简单的滤波方法,它的原理是用一个窗口覆盖图像的每个像素,然后取窗口所有像素的平均值来代替心像素的值。均值滤波可以有效地去除图像的噪声,但是处理后的图像可能会失去一些细节信息,因此不适用于对图像边缘和细节信息要求较高的场景。 2. 高斯滤波高斯滤波是一种基于高斯函数的滤波方法,它可以对图像进行平滑处理,同时保留边缘和细节信息。高斯滤波的原理是用一个高斯核函数代替均值滤波的平均值,这个核函数可以根据需要调整参数来控制滤波的程度。高斯滤波适用于需要对图像进行平滑处理,同时保留边缘和细节信息的场景。 3. 双边滤波双边滤波是一种基于像素间距离和像素灰度值差异的滤波方法,它可以保留边缘和细节信息,并且对图像进行平滑处理。双边滤波的原理是用一个核函数对图像的像素进行加权平均,这个核函数包括两个部分,一个是像素间的距离权值,另一个是像素灰度值差异的权值。双边滤波适用于需要同时保留边缘和细节信息,并对图像进行平滑处理的场景。 4. 值滤波:值滤波是一种非线性滤波方法,它的原理是将图像每个像素周围的像素排序,然后取间值代替心像素的值。值滤波可以有效地去除椒盐噪声等孤立噪声,但是对于连续噪声效果不佳。值滤波适用于需要去除孤立噪声的场景。 以上四种滤波方法各有特点和应用场景,具体选择哪种方法需要根据实际情况和需求进行评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

百年孤独百年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值