这一篇记录几种OpenCV提供的滤波函数,包括2D卷积、平均滤波、高斯滤波、中值滤波和双边滤波。
1、2D卷积
2D卷积使用的是OpenCV提供的filter2D()函数,该函数需要传入一个卷积核,这个卷积核可以通过numpy来构造:
import numpy as np
import cv2 as cv
src = cv.imread("D:/lena.bmp")
kernel = np.ones((5,5),np.float32)/25
dst = cv.filter2D(src,-1,kernel)
cv.imshow('filter2D', dst)
cv.waitKey(0)
cv.destroyAllWindows()
2、平均滤波blur
OpenCV的平均滤波用的是blur:
import numpy as np
import cv2 as cv
src = cv.imread("D:/lena.bmp")
dst = cv.blur(src,(5,5))
cv.imshow('filter2D', dst)
cv.waitKey(0)
cv.destroyAllWindows()
3、高斯模糊
高斯模糊的函数是cv2.GaussianBlur():
import numpy as np
import cv2 as cv
src = cv.imread("D:/lena.bmp")
dst = cv.GaussianBlur(src, (5,5), 0)
cv.imshow('filter2D', dst)
cv.waitKey(0)
cv.destroyAllWindows()
代码中之定义了X轴的标准差为0,所以在使用的时候OpenCV会把Y轴的标准差也设置为0,然后因为标准差为零,所以会函数会根据核的大小自己计算。也就是说,如果只定义了X轴的标准差,则Y轴会与X轴一样,如果定义标准差为0,那么函数就会自己计算标准差。
4、中值模糊
中值模糊是比较适合椒盐噪声的,其函数为cv2.medianBlur:
import numpy as np
import cv2 as cv
src = cv.imread("D:/lena.bmp")
dst = cv.medianBlur(src, 5)
cv.imshow('filter2D', dst)
cv.waitKey(0)
cv.destroyAllWindows()
5、双边滤波
哈,这个是磨皮滤波,OpenCV的双边滤波是cv2.bilateralFilter(),这个函数有四个输入,分别是原图、尺寸、颜色标准差和空间标准差:
import numpy as np
import cv2 as cv
src = cv.imread("D:/lena.bmp")
dst = cv.bilateralFilter(src, 9, 50, 100)
cv.imshow('filter2D', dst)
cv.waitKey(0)
cv.destroyAllWindows()
之所以叫它磨皮滤波,这是因为它会将相对平坦处平滑掉,然后保持边缘不变,这样的话变化较小的纹理会被模糊掉,也就是起到类似磨皮的效果哈,不信可以找张没开美颜的自拍试试...
可以注意lena的脸和肩膀...23333....
只记得花开碧树
可曾顾衾冷锦疏
最难忘 应是来时路
那会儿身影
不斜也扶
到如今
凭谁问甘苦
梦中事
笑是真笑
哭是真哭
-- 汪国真 《在梦里,我遇见了你》