【OpenCV 4】边缘保护滤波:edgePreservingFilter()

一、编程环境:

OpenCV 4.1.0
IDEVisual Studio 2017 Enterprise (15.9.14)
操作系统Windows 10 x64 中文专业版 (1903)

二、图像边缘保护滤波:

保边滤波器(Edge Preserving Filter)是指在滤波过程中能够有效的保留图像中的边缘信息的一类特殊滤波器。其中双边滤波器(Bilateral filter)、引导滤波器(Guided image filter)、加权最小二乘法滤波器(Weighted least square filter)为几种比较广为人知的保边滤波器。

高斯双边模糊与mean shift均值模糊两种边缘保留滤波算法,都因为计算量比较大,无法实时实现图像边缘保留滤波,限制了它们的使用场景,OpenCV中还实现了一种快速的边缘保留滤波算法。

高斯双边与mean shift均值在计算时候使用五维向量是其计算量大速度慢的根本原因,该算法通过等价变换到低纬维度空间,实现了数据降维与快速计算。

三、程序说明:

  • OpenCV 中的 edgePreservingFilter()函数:
void edgePreservingFilter( InputArray src, OutputArray dst, int flags = 1,
                           float sigma_s = 60, float sigma_r = 0.4f);
  • 参数说明:

src: 输入 8 位 3 通道图像。

dst: 输出 8 位 3 通道图像。

flags: 边缘保护滤波  cv::RECURS_FILTER 或 cv::NORMCONV_FILTER。

enum
{
    RECURS_FILTER = 1,    // Recursive Filtering
    NORMCONV_FILTER = 2   // Normalized Convolution Filtering
};

sigma_s:取值范围为 0~200。

sigma_r:取值范围为 0~1。

当sigma_s 取值不变时候,sigma_r 越大图像滤波效果越明显;

当sigma_r 取值不变时候,窗口 sigma_s 越大图像模糊效果越明显;

当sgma_r取值很小的时候,窗口 sigma_s 取值无论如何变化,图像双边滤波效果都不好!

四、示例程序:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[]) {
	Mat src = imread("../images/test.jpg");
	if (src.empty()) {
	    printf("不能打开图像!\n");
	    return -1;
	}

	namedWindow("1-原图", WINDOW_AUTOSIZE);
	imshow("1-原图", src);

	Mat dst;
	edgePreservingFilter(src, dst, 1, 60, 0.44);
	imshow("2-edgePreservingFilter", dst);

	waitKey(0);
	return 0;
}

五、运行效果:


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值