这一篇记录几种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....

只记得花开碧树

可曾顾衾冷锦疏

最难忘 应是来时路

那会儿身影

不斜也扶

到如今

凭谁问甘苦

梦中事

笑是真笑

哭是真哭

-- 汪国真 《在梦里,我遇见了你》