/*
*图像模糊一
*模糊原理
Smooth/Blur 是图像处理中最简单和常用的操作之一
使用该操作的原因之一就为了给图像预处理时候减低噪声,避免后续图像处理操作的干扰
使用Smooth/Blur操作其背后时数学卷积计算
g(i, j) = ∑f(i+k, j+l)h(k, l)
h(k, l)表示卷积算子,又叫做掩膜,对一个图像f每个中心位置是(i, j)然后把掩膜放上去然后两个乘积求和对k和l范围之内的,k和l的大小又称窗口大小,卷积和的大小又叫做窗口大小
输出是在另外一张图上,如果在(i, j)这个像素上面最后输出的是在新图像(i, j)这个位置上的像素值,对整幅图象从左到右从上到小这样走一遍就产生了一幅卷积处理之后的图像
卷积计算在数学上本来是连续的 图像又是离散的那种一个点一个点的对象 所以就变成求和这个操作了即简单化了
通常这些卷积算子计算都是线性操作,所以常见的Smooth/Blur又叫线性滤波
*相关API
均值模糊 基于均值的模糊
-blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1, -1));
原图像 目标图像 窗口大小 默认为中心点(就是掩膜覆盖的中心点)
高斯模糊 基于权重的模糊
-GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay) 其中Size(x, y)中的x和y必须是正数而且是奇数, 调整高斯窗口的分布(即正态分布是什么样的情况是用这个参数调节的)
*图像模糊二
*中值滤波 基于统计学的一个滤波,中值滤波还可以变成最小值最大值滤波
统计排序的滤波器,中值对椒盐噪声有很好的抑制作用,椒盐噪声有一个极大值极小值这个特性
*双边滤波 主要是高斯双边滤波,主要是针对高斯滤波有一些缺点怎么去改善它得到一个高斯双边滤波
均值滤波无法克服边缘像素信息丢失缺陷,原因是均值滤波是基于平均权重, 都是1,高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同
高斯双边模糊是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变
*相关API
中值模糊 medianBlur(Mat src, Mat dst, ksize)
双边模糊 bilateraIFilter(src, dest, d = 15, 150, 3)
//参数分别为原图像,输出图像,d = 15:计算的半径, 半径之内的像素都会被计算,如果提供-1则根据sigma space参数取值;
//150:为sigma color 决定多少差值之内的像素会被计算;
//3:sigma space 如果d的值大于0则声明无效,否则根据它来计算d值
//中间的size大小必须大于1并且必须是奇数,因为一个窗口如果要有中心像素的话,它偶数不好找中心像素;还有因为高斯要中心化那个参数的
*/
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src, dst;
src = imread("D:/A_Graduation/learning/opencv/tangwei.jpg");
if (!src.data)
{
printf("Could not load image src1...\n");
return -1;
}
char input_win[] = "input image";
char output_win[] = "output image";
namedWindow(input_win, CV_WINDOW_AUTOSIZE);
namedWindow(output_win, CV_WINDOW_AUTOSIZE);
imshow(input_win, src);
//blur(src, dst, Size(1, 15), Point(-1, -1)); //给一个小小的blur 3*3的均值模糊:Size(3, 3); x轴方向的模糊:Size(15, 1);y方向的模糊:Size(1, 15)
//GaussianBlur(src, dst, Size(5, 5), 11, 11);
//medianBlur(src, dst, 3); //就是3*3的了
bilateralFilter(src, dst, 15, 100, 3);
//双边滤波后提高对比度可以达到很好的美颜效果
Mat resImage;
Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(dst, resImage, -1, kernel, Point(-1, -1), 0);
namedWindow("resImage", CV_WINDOW_AUTOSIZE);
imshow("resImage", resImage);
imshow(output_win, dst);
waitKey(0);
return 0;
}
均值模糊和中值模糊的原理也就名字上说的那点差别:中值是窗口所覆盖的所有像素点排序后取中值再赋值,均值是窗口覆盖的所有像素点与掩膜的乘积求和后取均值(以免超过255)再赋值