图像平滑处理(Smoothing Images)
图像模糊处理(Blurring Images)
图像滤波(Image Filtering)
图像平滑处理指:在尽量保留原有信息的情况下,过滤掉图像内部的噪声
- 均值滤波
- 方框滤波
- 高斯滤波
- 中值滤波
- 双边滤波
- 2D卷积
均值滤波
指当前像素点周围的N*N个像素的均值来替代当前像素值
缺点:图像的边界处理时,由于图像外部是没有像素点和像素值的,显然是无法计算该点的5 * 5的邻域的均值的
dst=cv2.blur(src,ksize)
import cv2
img=cv2.imread("D:/hjb.jpg")
r=cv2.blur(img,(5,5))
cv2.imshow("img",img)
cv2.imshow("r",r)
cv2.waitKey(0)
cv2.destroyAllWindows()
不同大小卷积核,对比均值滤波的结果
import cv2
img=cv2.imread("D:/hjb.jpg")
r=cv2.blur(img,(5,5))
r30=cv2.blur(img,(30,30))
cv2.imshow("img",img)
cv2.imshow("r",r)
cv2.imshow("r30",r30)
cv2.waitKey(0)
cv2.destroyAllWindows()
方框滤波
可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值和的平均值还是邻域像素值之和
dst=cv2.boxFilter(src,ddepth.ksize,normalize)
ddepth=-1表示与原始图像使用相同的图像深度
normalize=1表示进行归一化处理
normalize=0表示不需要归一化处理
import cv2
img=cv2.imread("D:/hjb.jpg")
rst1=cv2.boxFilter(img,-1,(5,5),normalize=1)
rst2=cv2.boxFilter(img,-1,(5,5),normalize=0)
rst3=cv2.boxFilter(img,-1,(2,2),normalize=0)
cv2.imshow("img",img)
cv2.imshow("rst1",rst1)
cv2.imshow("rst2",rst2)
cv2.imshow("rst3",rst3)
cv2.waitKey(0)
cv2.destroyAllWindows()
下面三句话是等价的
r=cv2.boxFilter(img,-1,(5,5))
r=cv2.boxFilter(img,-1,(5,5),normailize=1)
r=cv2.blur(img,(5,5))
高斯滤波
-
在高斯滤波中,会将中心点的权重加大,远离中心点的权重减小
-
在高斯滤波中,核的宽度核高度可以不相同,但是他们必须是奇数
在实际处理中,可以显式指定sigmaX 和sigmaY为默认值0
dst=cv2.GaussianBlur(src,ksize,0,0)
import cv2
img=cv2.imread("D:/hjb.jpg")
rst=cv2.GaussianBlur(img,(5,5),0,0)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()
中值滤波
用邻域内所有像素值的中间值来代替当前像素点的像素值
import cv2
img=cv2.imread("D:/hjb.jpg")
rst=cv2.medianBlur(img,3)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()
双边滤波
在滤波过程中可以有效地保留图像内的边缘信息
边界模糊是滤波处理过程中对邻域像素取平均值所造成的结果,上述滤波处理过程单纯地考虑空间信息,造成了边界模糊和部分信息的丢失
双边滤波在计算某一个像素点的新值时,不仅考虑距离信息(距离越远,权重越小),还考虑色彩信息(色彩差别越大,权重越小)
dst=cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace)
后面两个sigma参数取相同,可取适中100
import cv2
img=cv2.imread("D:/hjb.jpg")
rst=cv2.bilateralFilter(img,25,100,100)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()
采用高斯滤波和双边滤波的比较
import cv2
img=cv2.imread("D:/hebai.jpg")
rst1=cv2.GaussianBlur(img,(5,5),0,0)
rst2=cv2.bilateralFilter(img,55,100,100)
cv2.imshow("img",img)
cv2.imshow("rst1",rst1)
cv2.imshow("rst2",rst2)
cv2.waitKey(0)
cv2.destroyAllWindows()
2D卷积
允许用户自定义卷积核实现卷积操作
dst=cv2.filter2D(src,ddepth,kernel)
ddepth一般使用-1表示与原始图像使用相同的图像深度
kernel自定义卷积核
例如设计一个9 * 9大小的卷积核,让卷积核内所有权重值相等
kernel=np.ones((9,9),np.float32)/81
import cv2
import numpy as np
img=cv2.imread("D:/hjb.jpg")
kernel=np.ones((9,9),np.float32)/81
rst=cv2.filter2D(img,-1,kernel)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()
网友评论