opencv图像处理之图像平滑(模糊)

0.图像模糊介绍

和一维信号一样,我们也可以对2D 图像实施低通滤波(LPF),高通滤波
(HPF)等。LPF 帮助我们去除噪音,模糊图像。HPF 帮助我们找到图像的边
缘。

图像平滑(smoothing)/模糊(blur)就是对2D 图像实施低通滤波。

啥叫低通呢?就是图像的低频部分通过。

啥又是低频呢?

低频就是颜色缓慢变化,也就是每个通道的灰度缓慢地变化,就代表着那是连续渐变的一块区域,这部分就是低频。高频就是灰度急剧变化的区域,边缘和噪点就是典型的高频部分。

这么低通过滤一遍之后,图像就会变得更模糊,可以去除一部分噪点,边缘不再清晰。

具体过滤的方法就是做2D卷积,遍历每个像素,根据它周围的像素值改变它的值。

1.平均

  • cv2.blur()
blur=cv2.blur(self.img,(5,5))

他只是用卷积框覆盖区域所有像素的平均值来代替中心元素。可以使用函数cv2.blur() 和cv2.boxFilter() 来完这个任务。我们需要设定卷积框的宽和高。
在这里插入图片描述

2.高斯模糊

  • cv2.GaussianBlur()
gaussian = cv2.GaussianBlur(self.img, (5, 5), 0)

现在把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求加权平均数,全就是方框里的值)。实现的函数是cv2.GaussianBlur()。我们需要指定高斯核的宽和高(必须是奇数)。以及高斯函数沿X,Y 方向的标准差。如果我们只指定了X 方向的的标准差,Y 方向也会取相同值。如果两个标准差都是0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从图像中去除高斯噪音。

3.中值模糊

  • cv2.medianBlur()
median=cv2.medianBlur(self.img,5)

顾名思义就是用与卷积框对应像素的中值来替代中心像素的值。这个滤波器经常用来去除椒盐噪声(salt-and-pepper noise)。前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他。他能有效的去除噪声。卷积核的大小也应该是一个奇数

4.双边滤波

  • cv2.bilateralFilter()
bilateral=cv2.bilateralFilter(self.img,8,75,75)

函数cv2.bilateralFilter() 能在保持边界清晰的情况下有效的去除噪音。但是这种操作与其他滤波器相比会比较慢。我们已经知道高斯滤波器是求中心点邻近区域像素的高斯加权平均值。这种高斯滤波器只考虑像素之间的空间关系,而不会考虑像素值之间的关系(像素的相似度)。所以这种方法不会考虑一个像素是否位于边界。因此边界也会别模糊掉,而这正不是我们想要的。
双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。

5.代码与效果

def blur(self):
    blur=cv2.blur(self.img,(5,5))
    gaussian = cv2.GaussianBlur(self.img, (5, 5), 0)
    median=cv2.medianBlur(self.img,5)
    bilateral=cv2.bilateralFilter(self.img,8,75,75)
    # 9 邻域直径,两个75 分别是空间/灰度值相似性高斯函数标准差
    titles = ['raw', 'mean','gaussian','median','bilateral']
    images = [self.img, blur,gaussian,median,bilateral]
    for i in range(5):
        img=cv2.cvtColor(images[i],cv2.COLOR_BGR2RGB)
        plt.subplot(2,3,i+1),plt.imshow(img)
        plt.title(titles[i])
        plt.xticks([]),plt.yticks([])
    plt.show()

在这里插入图片描述

*一个关于图像频率的坑

什么是图像的频率?图片来源:知乎:不明所以

在这里插入图片描述
但是这样一个曲面就是由很多个正线平面波组成的(傅里叶变换就是说:所有的波都可以用很多个正弦波叠加表示)。
二维中的正弦平面波,可以用4个参数来描述:

频率 f f ,幅度 A A ,相位 ψ \psi ,方向 n \overrightarrow {n}

复习一下高中的三角函数通式:
f ( x ) = A s i n ( ω x + ψ ) f(x)=Asin(\omega x+\psi)
它的图像为:
在这里插入图片描述
ω \omega >0的条件下: A A :表示三角函数的振幅;三角函数的周期 T = 2 π / ω T=2π/ω ;三角函数的频率 f = 1 / T f=1/T ω x + ψ \omega x+\psi 表示三角函数的相位; ψ \psi 表示三角函数的初相位。

可是这和图像的低频高频又有什么关系呢?……

发布了132 篇原创文章 · 获赞 40 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36622009/article/details/104542383