文章目录
- 图像去模糊中的均值滤波、高斯滤波和双边滤波简单介绍
- 均值滤波
- 高斯滤波
- 双边滤波
- 总结
图像去模糊中的均值滤波、高斯滤波和双边滤波简单介绍
图像模糊是指图像中的细节和边缘被平滑和模糊化,通常是由于图像采集设备或者图像传输过程中的噪声和抖动引起的。为了恢复图像的细节和边缘,可以使用图像去模糊技术对模糊图像进行处理。本文将介绍一些常见的图像去模糊技术和它们的实现方法。
均值滤波
均值滤波是一种常见的线性滤波器,它通过用图像局部区域的像素平均值替换中心像素来减小噪声和细节。在均值滤波中,每个像素的值被替换为它周围像素的平均值。均值滤波器的大小通常是一个正方形或矩形,大小从 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
:输入图像,可以是单通道或多通道图像,数据类型为uint8
或float32
。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_101
或cv2.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 的像素值空间和像素值灰度差异对图像进行了双边滤波。
总结
在本文中,我们介绍了图像去模糊的三种常见方法:均值滤波、高斯滤波和双边滤波。这些方法都是基于滤波器对图像像素进行加权平均来减小噪声和细节的。每种方法都有其优点和缺点,需要根据具体应用场景选择合适的方法。在实际应用中,可以通过调整滤波器的大小和参数来控制图像的平滑程度和细节保留程度。