从头学习opencv(8)--边缘保留滤波EPF

边缘保留滤波

解释来自于https://blog.youkuaiyun.com/u013921430/article/details/84532068
高斯滤波之所以会导致图像变得模糊,是因为它在滤波过程中只关注了位置信息;例如,以 q qq 为中心的窗口中,某一点 p pp 在高斯滤波过程中的权重的计算方法如下式;
在这里插入图片描述

即在滤波窗口内,距离中心点越近的点的权重越大;这种只关注距离的思想在某些情况下是可行的,例如在平坦的区域,距离越近的区域其像素分布也越相近,自然地,这些点的像素值对滤波中心点的像素值更有参考价值。但是在像素值出现跃变的边缘区域,这种方法会适得其反,损失掉有用的边缘信息。此时就出现了一类算法——边缘保护滤波方法,双边滤波就是最常用的边缘保护滤波方法。

双边滤波的思想很简单,在高斯滤波的基础上加入了像素值权重项,也就是说既要考虑距离因素,也要考虑像素值差异的影响,像素值越相近,权重越大。将像素值权重表示为Gr ,空间距离权重表示为 Gs
  
  在这里插入图片描述
  在平坦区域,滤波器中每个像素点的Gr值相近,空间距离权重Gs 主导滤波效果。在边缘区域,边缘同侧的Gr值相近,且远大于边缘另一侧的Gr值,此时另一侧的像素点的权重对滤波结果几乎不影响,边缘信息得到保护。表现出了一定的自适应性。

在平坦区域出现噪声点时,噪声点周围的信号的权值都很小,在进行归一化后,这些权值得到了提升,因此对噪声点也有滤除效果。
  在这里插入图片描述

双边滤波

#双边滤波
def bi_demo(image):
    dst=cv.bilateralFilter(image,0,100,15)
    # ( src , d , sigmaColor , sigmaSpace , dst=None , borderType=None )
    # d等于0,让sigmaColor和sigmaSpace去计算d
    cv.imshow("bi_demo",dst)

函数API来自https://www.cnblogs.com/FHC1994/p/9097231.html
注意:

1.双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波

2.双边滤波函数原型:bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst

src参数表示待处理的输入图像。

d参数表示在过滤期间使用的每个像素邻域的直径。如果输入d非0,则sigmaSpace由d计算得出,如果sigmaColor没输入,则sigmaColor由sigmaSpace计算得出。

sigmaColor参数表示色彩空间的标准方差,一般尽可能大。较大的参数值意味着像素邻域内较远的颜色会混合在一起,从而产生更大面积的半相等颜色。

sigmaSpace参数表示坐标空间的标准方差(像素单位),一般尽可能小。参数值越大意味着只要它们的颜色足够接近,越远的像素都会相互影响。当d > 0时,它指定邻域大小而不考虑sigmaSpace。 否则,d与sigmaSpace成正比。

均值迁移

def shift_demo(image):
    dst=cv.pyrMeanShiftFiltering(image,10,50)
    cv.imshow("shift_demo",dst)

3.均值漂移pyrMeanShiftFiltering函数原型:pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]]) -> dst

src参数表示输入图像,8位,三通道图像。

sp参数表示漂移物理空间半径大小。

sr参数表示漂移色彩空间半径大小。

dst参数表示和源图象相同大小、相同格式的输出图象。

maxLevel参数表示金字塔的最大层数。

termcrit参数表示漂移迭代终止条件。

完整代码

import cv2 as cv
import numpy as np

#常量卷积核在于整幅图像卷积过程中,值是不变的
#颜色差卷积核是变量卷积,在每一个点的卷积值都不同,是根据周围像素值与中心像素之差计算的
#与中心点距离远的权重小,颜色差大的权重小

#双边滤波
def bi_demo(image):
    dst=cv.bilateralFilter(image,0,100,15)
    # ( src , d , sigmaColor , sigmaSpace , dst=None , borderType=None )
    # d等于0,让sigmaColor和sigmaSpace去计算d
    cv.imshow("bi_demo",dst)


#均值迁移
def shift_demo(image):
    dst=cv.pyrMeanShiftFiltering(image,10,50)
    cv.imshow("shift_demo",dst)


src = cv.imread("C:/Users/Administrator/Desktop/example.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
bi_demo(src)
shift_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
print("Hi,python!")

运行效果

我自己的图片效果不是很明显,所以特意从网上下载了一个比较明显的图片
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值