10. 边缘保留滤波EPF-cv2.bilateralFilter()、cv2.pyrMeanShiftFiltering()

1. 什么是EPF?

     高斯模糊: 基于权重,权重只考虑像素空间的分布,中间的权重大,边缘的权重小。没有考虑像素值之间的差异问题,没有考虑边缘。
  边缘保留滤波: 像素之间的差异很大,说明是显著特征,如果直接平滑(滤波),显著特征会消失。像素之间差异大的地方通常是边缘,所以边缘保留滤波处理后的图片,在平滑(滤波)的情况下,依旧能够保留图像的边缘.。

2. 实现方式:

2.1 高斯双边滤波-cv2.bilateralFilter

双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波效果是因为滤波器由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个是由像素差值决定滤波器系数.

  • 实现函数:cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
  • 参数说明:
  • src:输入图像

  • d:过滤时周围每个像素领域的直径

  • sigmaColor:Sigma_color较大,则在邻域中的像素值相差较大的像素点也会用来平均。

  • sigmaSpace:Sigma_space较大,则虽然离得较远,但是,只要值相近,就会互相影响。

sigma_space设置较大,sigma_color设置较小,可获得较好的效果(椒盐噪声)。

2.2 均值迁移滤波-cv2.pyrMeanShiftFiltering()

原理:meanShfit均值漂移算法是一种通用的聚类算法,它的基本原理是:对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。可以利用均值偏移算法的这个特性,实现彩色图像分割.

实现函数:cv2.pyrMeanShiftFiltering(src, dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria)

参数如下: 

  1. src,输入图像,8位,三通道的彩色图像;
  2. dst,输出图像,跟输入src有同样的大小和数据格式;
  3. sp,定义的漂移物理空间半径大小;
  4. sr,定义的漂移色彩空间半径大小;
  5. maxLevel,定义金字塔的最大层数;
  6. termcrit,定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合;

3. 代码如下:

import cv2 as cv
import numpy as np


def bi_demo(image):  # bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
    
    dst = cv.bilateralFilter(image, 0, 100, 15)  # 高斯双边
    cv.imshow("bi_demo", dst)


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

if __name__ == '__main__':
    src = cv.imread("../images/CrystalLiu1.jpg")  # 读入图片放进src中
    cv.namedWindow("Crystal Liu")  # 创建窗口
    cv.imshow("Crystal Liu", src)  # 将src图片放入该创建的窗口中
    bi_demo(src)
    shift_demo(src)

    cv.waitKey(0) # 等有键输入或者1000ms后自动将窗口消除,0表示只用键输入结束窗口
    cv.destroyAllWindows()  # 关闭所有窗口

 

你可能感兴趣的:(opencv基础知识,opencv,python,计算机视觉)