OpenCV---边缘保留滤波EPF

OpenCV经典的两种实现EPF方法:高斯双边和均值迁移

一:双边模糊

 差异越大,越会完整保留

def bi_demo(image):
    dst = cv.bilateralFilter(image,0,100,15)  #第二个参数d是distinct,我们若是输入了d,会根据其去算第3或4个参数,我们最好是使用第3或4个参数反算d,先设为0
    cv.imshow("bi_demo",dst)

src = cv.imread("./1.png")  #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
cv.imshow("input image",src)    #通过名字将图像和窗口联系
bi_demo(src)
cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows()  #销毁所有窗口 
def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None): # real signature unknown; restored from __doc__
值域和空域的两个方差sigma可以简单的设置为相等,小于10,无太大效果,大于150效果太强,像卡通片似的。
滤波器尺寸d:大于5将较慢(5 forreal-time),d=9for off-lineapplications,d 是像素邻域“直径”。计算的半径,半径之内的像数都会被纳入计算,如果提供-1,会从后面的参数sigmaSpace中自动计算。
Sigma_color颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 
Sigma_space坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace. 

双边滤波的内在想法是:在图像的值域(range)上做传统滤波器在空域(domain)上做的工作。空域滤波对空间上邻近的点进行加权平均,加权系数随着距离的增加而减少;值域滤波则是对像素值相近的点进行加权平均,加权系数随着值差的增大而减少。
对于第三个参数:d来说一般来说,要想得到比较好的结果,34、5参数最好都指定。

第三个参数如果设定值大于5,那计算会很慢,所以一般设置都等于5,如果少数情况需要去除比较大的噪声,那么d=9。要取得较好的平滑效果,最好在9附近
d或者Sigma_space设置的越大,包含的范围越大,耗时越长

若是高斯模糊,则整体都会模糊掉,实现滤镜效果。

二:均值迁移

推文:Opencv均值漂移pyrMeanShiftFiltering彩色图像分割流程剖析

def shift_demo(image):
    dst = cv.pyrMeanShiftFiltering(image,10,50)  #第二个参数d是distinct,我们若是输入了d,会根据其去算第3或4个参数,我们最好是使用第3或4个参数反算d,先设为0
    cv.imshow("shift_demo",dst)
def pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None): # real signature unknown; restored from __doc__
第一个参数src,输入图像,8位,三通道的彩色图像,并不要求必须是RGB格式,HSV、YUV等Opencv中的彩色图像格式均可;

第二个参数sp,定义的漂移物理空间半径大小;  #越大,细节丢失越多

第三个参数sr,定义的漂移色彩空间半径大小;

第四个参数dst,输出图像,跟输入src有同样的大小和数据格式; 第五个参数maxLevel,定义金字塔的最大层数; 第六个参数termcrit,定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合;

 

posted @ 2018-07-05 16:51  山上有风景  阅读(990)  评论(0编辑  收藏  举报