简介:本文主要记录了均值滤波、高斯滤波、中值滤波和双边滤波。
Smooth/Blur
是图像处理中最简单和常用的操作之一Smooth/Blur
操作其背后是数学的卷积计算
取周围K_width*K_height的像素的平均值代替操作点的像素。
★高斯滤波与均值滤波的差别在于取均值的过程中,高斯滤波方法中越靠近处理像素点的像素点所占的权重越大,中心的权重最大,其优点在于一定程度上保留了原来图像的特征。
★高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
(因为中值滤波是用领域的中值代替该点的像素值,所有会掩盖掉图片中的极大值值或者极小值,也就去除掉了图片中的椒盐噪点)
blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1));
GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);
代码演示:
#include
#include
using namespace std;
using namespace cv;
int main(char argc,char** argv)
{
Mat myImage = imread("women.jpg", 1);
if (!myImage.data)
{
cout << "couldn't load image..." << endl;
return -1;
}
char inputTitle[] = "input demo";
char outputTitle1[] = "blur demo";
char outputTitle2[] = "gaussianblur demo";
namedWindow(inputTitle, WINDOW_AUTOSIZE);
imshow(inputTitle, myImage);
Mat im_blur;
blur(myImage, im_blur, Size(5, 5), Point(-1, -1)); //均值滤波
Mat im_gaussianblur;
GaussianBlur(myImage,im_gaussianblur,Size(5,5),11,11); //高斯滤波
namedWindow(outputTitle1, WINDOW_AUTOSIZE);
imshow(outputTitle1, im_blur);
namedWindow(outputTitle2, WINDOW_AUTOSIZE);
imshow(outputTitle2, im_gaussianblur);
waitKey(0);
return 0;
}
dianBlur(Mat src, Mat dest, ksize);
bilateralFilter(src, dest, d=15,150, 3);
//15 –d 计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值
//150 – sigma color 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。决定多少差值之内的像素会被计算
//3 – sigma space 坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace. 如果d的值大于0则声明无效,否则根据它来计算d值
上图分别为原图、均值滤波处理、双边滤波处理
对比发现双边滤波保留了图像轮廓。
代码演示:
#include
#include
using namespace std;
using namespace cv;
int main(char argc,char** argv)
{
Mat myImage = imread("Scarlett Johansson.jpg", 1);
if (!myImage.data)
{
cout << "couldn't load image..." << endl;
return -1;
}
char inputTitle[] = "input demo";
char outputTitle1[] = "medianBlur demo";
char outputTitle2[] = "bilateralFilter demo";
namedWindow(inputTitle, WINDOW_AUTOSIZE);
imshow(inputTitle, myImage);
Mat im_medianBlur;
medianBlur(myImage, im_medianBlur,7); //中值滤波
Mat im_bilateralFilter;
bilateralFilter(myImage, im_bilateralFilter,7, 100,3); //双边模糊
namedWindow(outputTitle1, WINDOW_AUTOSIZE);
imshow(outputTitle1, im_medianBlur);
namedWindow(outputTitle2, WINDOW_AUTOSIZE);
imshow(outputTitle2, im_bilateralFilter);
waitKey(0);
return 0;
}
对比发现双边滤波较中值滤波保留了图像轮廓。
在双边滤波的基础上进行掩膜操作提高对比度:
Mat im_bilateralFilter;
bilateralFilter(myImage, im_bilateralFilter, 5, 100,3); //双边模糊
Mat resultImage;
Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1,
0);
filter2D(im_bilateralFilter, resultImage,
im_bilateralFilter.depth(), kernel, Point(-1, -1));
【完】
备注:以上内容转载笔者早期OneNote笔记,多为基础知识记录,比较简陋。
后记:笔者才疏学浅,如有错误,望指出。