(七)图像平滑操作

目录

 

1、卷积

2、图像模糊

1)平均

2)高斯模糊

3) 中值滤波

4)双边滤波


1、卷积

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

函数:cv2.filter2D()

思路:将一个5x5的卷积核放在像素A上,求与核对应的图像上25个像素的和,再取平均数,用这个平均数来代替像素A的值。重复以上操作直到将图像的每一个像素都更新一遍。

扫描二维码关注公众号,回复: 4983884 查看本文章

代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

path="D:\\openCV\\opencv\\sources\\samples\\data\\logo.png"
logo=cv.imread(path)

#5x5的卷积核
kernel=np.ones((5,5),np.float32)/25

#过滤后的图像
dst=cv.filter2D(logo,-1,kernel)

plt.subplot(1,2,1),plt.imshow(logo),plt.title("Original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(dst),plt.title("Averaging")
plt.xticks([]),plt.yticks([])
plt.show()

效果:

    

2、图像模糊

使用低通滤波器可以达到图像模糊的目的。这对去除噪音很有帮助。其实就是去除图像中的高频成分(比如噪音、边界)。OpenCV提供了四种模糊技术。

1)平均

函数:cv.blur() 、cv.boxFilter()

需要设定卷积框的宽和高。比如下面是一个3x3的归一化卷积框:

    

注意:如果不想使用归一化卷积框,应该使用cv2.boxFilter(),这时传入参数normalize=False

代码:


import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

path="D:\\openCV\\opencv\\sources\\samples\\data\\logo.png"
logo=cv.imread(path)


blur=cv.blur(logo,(5,5))

plt.subplot(1,2,1),plt.imshow(logo),plt.title("Original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(blur),plt.title("Blurred")
plt.xticks([]),plt.yticks([])
plt.show()

效果图:

    

这个效果感觉跟2维图像卷积没啥区别啊。

2)高斯模糊

如果把卷积核换成高斯核(卷积方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。原理的求平均数现在变成求加权平均数,权就是方框里的值)

函数:cv2.GaussianBlur()

说明:需要指定高斯核的宽和高(必须是奇数,不是奇数的话找不到中心点),以及高斯函数沿X,Y方向的标准差。如果我们指定了X方向的标准差,Y方向也会取相同的值。如果两个标准差都是0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从图像中去除高斯噪音。

代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

path="D:\\openCV\\opencv\\sources\\samples\\data\\pic2.png"
logo=cv.imread(path)

gaus=cv.GaussianBlur(logo,(5,5),0)

plt.subplot(1,2,1),plt.imshow(logo),plt.title("Original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(gaus),plt.title("Gaussian Bulrred")
plt.xticks([]),plt.yticks([])
plt.show()

效果图:

    

原始图像中没有高斯噪音,所以效果看起来不明显。

3) 中值滤波

顾名思义就是用与卷积核对应像素的中值来替代中心像素的值。这个滤波器经常用来去除椒盐噪声。卷积、平均值滤波、高斯滤波都是用一个新值来代替中心像素的值,而中值滤波是用中心像素周围的值来取代它。卷积核的大小也应该是一个奇数。

代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

path="D:\\openCV\\opencv\\sources\\samples\\data\\pic2.png"
logo=cv.imread(path)


median=cv.medianBlur(logo,5)
plt.subplot(1,2,1),plt.imshow(logo),plt.title("Original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(median),plt.title("Median Bulrred")
plt.xticks([]),plt.yticks([])
plt.show()

效果图:

    

因为这个图像中更多的是椒盐噪声,所以效果要比上图的高斯滤波好一点。

4)双边滤波

不常用啊

猜你喜欢

转载自blog.csdn.net/weixin_38664232/article/details/86550085