大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

所有文章
大宇私人伊甸园: 首页 > 所有文章 > 编程人生 > 开源库 > opencv > [001.10]统计中值算法和高斯双边滤波模糊算法

[001.10]统计中值算法和高斯双边滤波模糊算法

发布时间:2018/07/13 opencv 标签opencv中值算法高斯双边阅读:48

统计中值算法和高斯双边滤波模糊算法:

  • 中值滤波
  • 双边滤波
  • 代码演示

中值滤波:

统计排序滤波器

中值对椒盐噪声有很好的抑制作用

双边滤波:

均值模糊无法克服边缘像素信息丢失缺陷。原因是均值滤波是基于平均权重

高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同

高斯双边模糊 – 是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变

相关API:

中值模糊medianBlur(Mat src, Mat dest, ksize)

双边模糊bilateralFilter(src, dest, d=15, 150, 3);

– 15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值

– 150 – sigma color 决定多少差值之内的像素会被计算

– 3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值

中值模糊的ksize大小必须是大于1而且必须是奇数。

演示代码:

中值模糊算法:

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

using namespace std;
using namespace cv;

int main() {
	Mat src = imread("c:/dangtao.jpg");
	if (!src.data) {
		printf("error of open image");
		return -1;
	}
	Mat dst;
	medianBlur(src,dst,3);
	namedWindow("src image",CV_WINDOW_AUTOSIZE);
	namedWindow("dst image",CV_WINDOW_AUTOSIZE);
	imshow("src image",src);
	imshow("dst image",dst);
	waitKey(0);
	return 1;
}

是不是脸上的斑点没有了,椒盐噪声没有了。

高斯模糊和双边模糊比较:

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

using namespace std;
using namespace cv;

int main() {
	Mat src = imread("c:/dangtao.jpg");
	if (!src.data) {
		printf("error of open image");
		return -1;
	}
	Mat dst,gblur;
	//medianBlur(src,dst,3);
	GaussianBlur(src,gblur,Size(15,15),3,3);		//高斯模糊
	bilateralFilter(src,dst,15,100,5);				//双边模糊
	namedWindow("src image",CV_WINDOW_AUTOSIZE);
	namedWindow("dst image",CV_WINDOW_AUTOSIZE);
	namedWindow("GS image", CV_WINDOW_AUTOSIZE);
	imshow("src image",src);						//原图
	imshow("dst image",dst);						//双边模糊
	imshow("GS image",gblur);						//高斯模糊
	waitKey(0);
	return 1;
}

很明显高斯双边(最右边)比高斯(中间)要清楚很多。

双边模糊+矩阵掩膜算法=美图秀秀的磨皮效果:

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

using namespace std;
using namespace cv;

int main() {
	Mat src = imread("c:/dangtao.jpg");
	if (!src.data) {
		printf("error of open image");
		return -1;
	}
	Mat dst,gblur;
	//medianBlur(src,dst,3);
	//GaussianBlur(src,gblur,Size(15,15),3,3);		//高斯模糊
	bilateralFilter(src,dst,15,100,5);				//双边模糊
	namedWindow("src image",CV_WINDOW_AUTOSIZE);
	namedWindow("dst image",CV_WINDOW_AUTOSIZE);
	//namedWindow("GS image", CV_WINDOW_AUTOSIZE);
	imshow("src image",src);						//原图
	imshow("dst image",dst);						//双边模糊
	//imshow("GS image",gblur);						//高斯模糊
	Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	Mat out;
	filter2D(dst, out, -1, kernel, Point(-1, -1));
	namedWindow("out image", CV_WINDOW_AUTOSIZE);
	imshow("out image",out);
	waitKey(0);
	return 1;
}

是不是美了狠多了,原谅我,这已经是我找到最好的图片了,看来算法还是救不了你。
我还用别的图片做了一个demo,免得大家都以为我这个算法有问题:
The bottom line, for me, is simple.

Let’s hope it doesn’t take 500 years for a discipline of testing to becomes the standard for software developers.

From:dayu

您好!请登录

合作网站快捷登录:
点击取消回复

已有3评论

  • G开头术士
    G开头术士 回复

    这篇文章简明扼要的阐述了美团秀秀的算法,并且实际使用效果很好,希望博主能多多分享这种优秀的干货


    2018年07月13日07:26
  • 牛逼网
    牛逼网 回复

    你是真的牛逼


    2018年07月13日07:25

大宇博客

点击这里给我发消息点击这里给我发消息