在图像处理中,尽可能消除图片中的噪声,消除噪声就需要用到滤波,在本次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;
}
从结果上可以看出,双边滤波效果最好,既保留了轮廓,皮肤更加平滑,如果再用掩膜提高下对比度。。。。。。。新的修图工具get!!