第十五节、OpenCV学习(四)图像平滑与滤波
图像的平滑与滤波
平滑滤波是低频增强的空间域滤波技术,是图像模糊、消除噪声。
一、2D滤波器cv2.filter2D()
对于2D图像可以进行低通或者高通滤波操作,低通滤波(LPF)有利于去噪声,模糊图像,高通(HPF)有利于找到图像边界。
import cv2 import numpy as np img = cv2.imread('dog.jpg', 0) kernel = np.ones((5, 5), np.float32)/25 dst = cv2.filter2D(img, -1, kernel) cv2.imshow('img', img) cv2.imshow('dst', dst) cv2.waitKey(0) cv2.destroyAllWindows()
二、均值滤波
Opencv中有一个专门的平均滤波模板——归一化卷积模板,所有的滤波模板都是使卷积框覆盖区域所有像素点与模板相乘后得到的值作为中心像素的值。OpenCV中均值模板可以用cv2.blur()和cv2.boxFilter。
import numpy as np import cv2 img = cv2.imread('dog.jpg', 0) blur = cv2.blur(img, (3, 5)) # 模板大小3x5 box = cv2.boxFilter(img, -1, (3, 5)) cv2.imshow('img', img) cv2.imshow('blur', blur) cv2.imshow('box', box) cv2.waitKey(0) cv2.destroyAllWindows()
三、高斯滤波
模板中的数值将会中间的数值最大,往两边走越来越小,构造一个小的高斯包,这样可以减少原始图像信息的丢失。
在OpenCV实现的函数为cv2.GaussianBlur()。对于高斯模板,我们需要制定的是高斯核的高和宽(奇数),沿x与y方向的标准差(如果只给x,y=x,如果都给0,那么函数会自己计算)。高斯 核可以有效的去除图像的高斯噪声。当然也可以自己构造高斯核,相关函数为:cv2.GaussianKernel()。
import numpy as np import cv2 img = cv2.imread('dog.jpg', 0) # 在图像中加入噪声 for i in range(2000): _x = np.random.randint(0, img.shape[0]) _y = np.random.randint(0, img.shape[1]) img[_x, _y] = 255 # (5,5)表示卷积模板的大小,0表示的是沿x与y方向上的标准差 blur = cv2.GaussianBlur(img, (5, 5), 0) cv2.imshow('img', img) cv2.imshow('blur', blur) cv2.waitKey(0) cv2.destroyAllWindows()
四、中值滤波
中值滤波模板就是用卷积框中像素的中值代替中心值,达到去噪声的目的,尤其是椒盐噪声,
import numpy as np import cv2 img = cv2.imread('dog.jpg', 0) # 在图像中加入噪声 for i in range(2000): _x = np.random.randint(0, img.shape[0]) _y = np.random.randint(0, img.shape[1]) img[_x, _y] = 255 blur = cv2.medianBlur(img, 5) cv2.imshow('img', img) cv2.imshow('blur', blur) cv2.waitKey(0) cv2.destroyAllWindows()
五、双边滤波
双边滤波是一种可以保证边界清晰地去噪滤波器,之所以可以达到此去噪效果,是因为滤波器由两个函数构:一个函数是由几何空间距离决定滤波器系数,另一个由像素差决定滤波器系数,既考虑了图像的空间关系,也考虑图像的灰度关系。双边滤波同时使用了空间高斯权重和灰度相似性高斯权重,确保了边界不会被模糊。
import numpy as np import cv2 img = cv2.imread('dog.jpg', 0) # 在图像中加入噪声 for i in range(2000): _x = np.random.randint(0, img.shape[0]) _y = np.random.randint(0, img.shape[1]) img[_x, _y] = 255 # 9:表示的是滤波领域直径,后面两个:空间高斯函数标准差、灰度值相似性高斯函数标准差 blur = cv2.bilateralFilter(img, 9, 80, 80) cv2.imshow('img', img) cv2.imshow('blur', blur) cv2.waitKey(0) cv2.destroyAllWindows()