目录
1、卷积
与一维信号一样,也可以对2D图像实施低通滤波器(LPF),高通滤波器(HPF)等。LPF帮助我们去除噪音,模糊图像。HPF帮助我们找到图像的边界。
函数:cv2.filter2D()
思路:将一个5x5的卷积核放在像素A上,求与核对应的图像上25个像素的和,再取平均数,用这个平均数来代替像素A的值。重复以上操作直到将图像的每一个像素都更新一遍。
代码:
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)双边滤波
不常用啊