【图像平滑处理 opencv 实现】---滤波器总结(均值滤波,方框滤波,高斯滤波,中值滤波,双边滤波,2D卷积)---后续更新

目录

均值滤波

方框滤波

高斯滤波

中值滤波

双边滤波

2D卷积


均值滤波

定义:用当前像素点周围N*N个像素值的均值来替代当前像素值。针对边缘像素点,可以只取图像内存在的周围邻域点的像素值均值。

python代码:

opencv:
dst = cv2.blur(src,ksize,anchor,borderType)

dst -- 返回值
src -- 原始图像
ksize -- 滤波核大小 一般(3x3) (5x5) 越大,参与运算的像素点越多,去噪效果越好 图像失真就越严重  花费时间越长
anchor -- 锚点 默认值(-1,-1) 指当前计算均值的点位于核的中心的位置 一般使用默认值
borderType -- 边界样式 决定以何种方式处理边界 一般默认值
所以:
dst = cv2.blur(src,ksize)

python 代码
import cv2
src = cv2.imread("图像地址")
dst = cv2.blue(src,(5,5))    
cv2.inshow("src",src)
cv2.imshow("dst",dst)
cv2.waitkey()
cv2.destroyAllWindows()

方框滤波

定义:可以自由选择是否对均值滤波的结果进行归一化,即可以选择滤波结果是领域像素值之和还是像素值之和的平均值。

python代码:

OpenCV
dst = cv2.boxFilter(src,ddepth,ksize,anchor,normalize,boderType)

ddepth -- 图像深度 用-1 表示与原始图像使用相同的图像深度
normalize -- 在滤波是是否进行归一化 是一个逻辑值 1为真(使用均值)(默认) 0为假(使用像数值和)

python 代码
import cv2
src = cv2.imread("图像地址")
dst = cv2.boxFilter(src,-1,(5,5),normalize=0)    
cv2.inshow("src",src)
cv2.imshow("dst",dst)
cv2.waitkey()
cv2.destroyAllWindows()

高斯滤波

定义:在进行均值滤波和方框滤波时,邻域内的每个像素的的权重是相等的,高斯滤波中,中心点的权重加大,远离中心点的权重值减少,在此基础上计算各个像素值不同权重的和。

高斯滤波中,卷积核中的值不全是1;

核的宽度和高度可以不同,但是必须都是奇数。

高斯滤波核示例
1 2 1
2 8 2
1 2 1

 

实际计算中高斯滤波核
1/20 2/20 2/20
2/20 8/20 2/20
1/20 2/20 1/20

 

python代码:

OpenCV
dst = cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)
sigmaX -- 卷积核在水平方向上(X轴方向)的标准差 控制权重比例
sigmaY -- 卷积核在垂直方向上(Y轴方向)的标准差 控制权重比例 若该值=0 则只考虑X轴方向 若sigmaX=0 && sigmaY=0 则通过ksize.width ksize.heght 计算得到
sigmaX = 0.3X[(ksize.width-1)x0.5-1]+0.8
sigmaX = 0.3X[(ksize.height-1)x0.5-1]+0.8
sigmaX 是必选参数 sigmaY 是可选参数 但是可以将参数设置为0 让函数自己去计算sigmaX
官方文档建议显式指定ksize sigmaX sigmaY 避免出现错误
dst = cv2.GaussianBlur(src,ksize,sigmaX,sigmaY)

python 代码
import cv2
src = cv2.imread("图像地址")
dst = cv2.GaussianBlur(src,(5,5),0,0) 
cv2.inshow("src",src)
cv2.imshow("dst",dst)
cv2.waitkey()
cv2.destroyAllWindows()

中值滤波

定义:用邻域所有像素值的中间值来代替当前像素点的像素值。会将这些像素值进行排序,将中间位置的像素值作为当前像素点的像素值。(奇数个像素点)。

特点:由于没有进行中值处理,中值滤波不存在均值滤波带来的细节模糊的问题,但是因为需要排序的操作,所以此方式计算量比较大。

python代码:

OpenCV
dst = cv2.mediaBlur(src,ksize)
注意:核大小必须是比1大的奇数

python 代码
import cv2
src = cv2.imread("图像地址")
dst = cv2.mediaBlur(src,3)
cv2.inshow("src",src)
cv2.imshow("dst",dst)
cv2.waitkey()
cv2.destroyAllWindows()

双边滤波

定义:是综合考虑空间信息核色彩信息的滤波方式,在处理过程中能够有效的保护图像的边缘信息。

特点:上述的滤波方式只是考虑了空间的权重信息,这种方式计算方便,但是边缘信息的处理上有较大的问题。

双边滤波在计算时,不仅考虑距离信息(距离越远,权重越小)(这里说的不是像素值的物理距离,而是颜色值的距离:0-255),还考虑色彩信息(色彩差别越大,权重越小),这样既可以去除噪音,也能很好的保护边缘信息。

 

边缘示例
   

均值滤波,方框滤波,高斯滤波会导致中间部分边缘模糊。

双边滤波的优势体现在对边缘信息的处理上。

python代码:

OpenCV

dst = cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
d -- 空间距离参数 表示以当前像素点为中心的直径 如果该值非正数 则自动从sigmaSpace 计算得到 若d>5 计算速度慢 一般d=5 ruo 离线滤波噪声较大 则d=9
sigmaColor -- 颜色差值范围 与当前像素点的像素值差值小于sigmaColor的像素点 能够参与到当前滤波中 值越大 表示周围有越多的像素可以参与到计算中来 =255 全部都可以参与 =0 滤波失去意义
sigmaSpace -- 坐标空间的sigma值 值越大 说明有越多的的点参与计算 d>0时 无论sigmaSpace 值如何 d 都指定领域的大小 否则 d 与sigmaSpace 的值成比例

python 代码
import cv2
src = cv2.imread("图像地址")
dst = cv2.bilateralFilter(src,25,100,100)
cv2.inshow("src",src)
cv2.imshow("dst",dst)
cv2.waitkey()
cv2.destroyAllWindows()

2D卷积

背景:OpenCV 提供多种滤波方式来实现平滑图像的效果,大多数滤波方式所使用的卷积核都有一定的灵活性,能够设置卷积核的大小,但是,我们有时候希望使用特定的卷积核来进行卷积的操作。这时候,需要使用其自定义的卷积函数。

python代码

OpenCV

dst = cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)
delta -- 修正值 是可选项 如果该值存在 会在基础滤波的基础之上加上该值作为最终的处理结果

python 代码
import cv2
import numpy as np
src = cv2.imread("图像地址")
kernel = np.ones((9,9),np.float32)/81
dst = cv2.filter2D(src,-1,kernel)
cv2.inshow("src",src)
cv2.imshow("dst",dst)
cv2.waitkey()
cv2.destroyAllWindows()

kernel = np.ones((9,9),np.float32)/81
使用ones()函数创建卷积核 

kernel:(1/81 X 右边矩阵)

 

1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1


致谢

opencv轻松入门-面向python 李立宗著

 

你可能感兴趣的:(python,opencv,图像处理)