C++ Opencv——图像处理——滤波

https://blog.csdn.net/zoucharming/article/details/70197863

在图像处理中,尽可能消除图片中的噪声,消除噪声就需要用到滤波,在本次opencv学习中,学习了三个滤波方式。

(1)平均滤波,就是将一个区域内的像素值求和取平均值,然后用这个平均值替换区域中心的像素值。

blur(源Mat对象,目标Mat对象,Size对象,Point对象)//Size对象用来确定区域大小,Point对象如果x,y都是-1则表示更新区域中心的像素。

(2)高斯滤波,也是将一个区域的像素值求取平均值替换区域中心的像素值,但是是加权平均,权重按照二维正态分布。

GaussianBlur(源Mat对象,目标Mat对象,Size对象,x方向正太分布参数,y方向正太分布参数)

(3)中值滤波,之前的两个滤波都有个问题,如果区域中有极端值,很可能影响滤波效果,中值滤波采用区域中的中值来替换,有利于克服椒盐噪声。

medianBlur(源Mat对象,目标Mat对象,int size)//这里的size表示正方形区域的边长

(4)双边滤波,之前的滤波还有个问题,他们都会把轮廓给模糊了,有一些区域之间相差较大的像素,这往往能看出轮廓,所以如果我们给个限制范围,如果两点间的像素值差距大于这个范围就不滤波了,保留图像轮廓

bilateralFilter(源Mat对象,目标Mat对象,int 区域半径,int 限制范围,int space)//space是当区域半径给的是0时,用来计算区域范围的,一般情况下没用,随便给个数就行。
 

#include<opencv2\opencv.hpp>
#include<iostream>
#include<math.h>
#include<algorithm>
 
using namespace std;
using namespace cv;
 
int main()
{
	Mat src;
	src = imread("1.jpg", 1);
	if (src.empty())
	{
		printf("cannot load!!\n");
		return -1;
	}
	namedWindow("原图");
	imshow("原图", src);
	Mat dst,dst1;
	blur(src, dst, Size(3, 3), Point(-1, -1));
	namedWindow("均值滤波");
	imshow("均值滤波", dst);
	GaussianBlur(src, dst, Size(5, 5), 5, 5);
	namedWindow("高斯滤波");
	imshow("高斯滤波", dst);
	medianBlur(src, dst, 5);
	namedWindow("中值滤波");
	imshow("中值滤波", dst);
	bilateralFilter(src, dst, 5, 100, 3);
	namedWindow("双边滤波");
	imshow("双边滤波", dst);
 
	waitKey(0);
 
	return 0;
}

双边滤波效果最好,既保留了轮廓,皮肤更加平滑,如果再用掩膜提高下对比度,就可以进行修图了。

扫描二维码关注公众号,回复: 4575738 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_41275726/article/details/85107714