系列文章目录
前言
该篇主要讲解图像模糊的原理及实现,图像模糊包括均值模糊、高斯模糊、中值模糊和双边模糊。
一、均值模糊和高斯模糊(模糊)
均值模糊原理:
参考下图,假设有6×6的图像像素矩阵
卷积过程:6×6上面是3×3的窗口,从左往右,从上往下移动,将黄色部分的每个像素点值之和取平均值,赋值给中心红色像素点,当做卷积处理之后的新的像素值,每次移动一个像素;但会存在边缘值无法计算的问题,并且,一个很高的像素值可能在取平均值之后,变成一个很低的像素值
高斯模糊:不会存在边缘值无法计算的问题,并且每个点的像素值重新计算后,变化不会很大
代码如下(示例):
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(void)
{
Mat srcImg, blurImg, gsBlurImg;
srcImg = imread("D:\\1.jpg");
if (!srcImg.data)
{
cout << "can not load image.." << endl;
return -1;
}
// 功能:均值模糊
// 参数:1、输入图像
// 2、输出图像
// 3、Size(x, y),如果x和y相等,则为均值模糊,如果x大于y,则横向模糊;反之纵向模糊;值越大,模糊越明显
// 4、默认Point(-1, -1),计算后的值赋给中心点
// 返回:无
blur(srcImg, blurImg, Size(11, 11), Point(-1, -1));
// 功能:高斯模糊
// 参数:1、输入图像
// 2、输出图像
// 3、Size(x, y),如果x和y相等,则为均值模糊,如果x大于y,则横向模糊;反之纵向模糊;值越大,模糊越明显;
// x和y必须是正数而且是奇数
// 4、X方向的高斯标准差
// 5、Y方向的高斯标准差;如果sigmaY为零,则设置为等于sigmaX,如果两个sigma都为零,则取Size的宽度和高度
// 返回:无
GaussianBlur(srcImg, gsBlurImg, Size(11, 11), 11, 11);
imshow("测试", srcImg);
imshow("模糊", blurImg);
imshow("高斯模糊", gsBlurImg);
waitKey(0);
return 0;
}
二、中值模糊和双边模糊(美颜)
中值模糊(滤波)原理:
参考下图,3×3区域像素排序是:
115、119、120、123、124、125、126、127、150;
中值等于:124
中值模糊对椒盐噪声有很好的抑制作用,可以去掉黑点和白点
双边模糊(滤波):保留边缘信息的情况下,去掉人脸微小差异,相当于磨皮
代码如下(示例):
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(void)
{
Mat src, dst;
src = imread("E:\\1.jpg");
if (src.empty())
{
cout << "load image fail..." << endl;
return -1;
}
imshow("input image", src);
// 功能:中值模糊,去掉椒盐噪声
// 参数:src 输入图像
// dst 输出图像
// ksize 光圈线性大小,当前使用3×3的大小;必须是奇数且大于1,例如:3、5、7。。。
// 返回:无
// medianBlur(src, dst, 3);
// imshow("medianBlur", dst);
// 功能:双边模糊,去掉人脸微小差异,相当于磨皮,保留边缘信息
// 参数:src 输入图像
// dst 输出图像
// d 计算的半径(磨皮的程度),半径之内的像素都会纳入计算,如果传-1,则根据sigmaSpace参数取值
// sigmaColor 决定多少差值之内的像素会被计算,差值越大,边缘信息保留越少,磨皮越严重,图片越模糊
// sigmaSpace 如果d的值大于0则无效,否则,根据它来计算d值
// 输出:无
bilateralFilter(src, dst, 15, 100, 3);
imshow("bilateralFilter", dst);
// 再利用掩膜计算,增加图像对比度,最终实现美颜相机的效果
Mat result;
Mat kernal = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(dst, result, -1, kernal, Point(-1, -1), 0);
imshow("filter2D", result);
waitKey(0);
return 0;
}
总结
1、均值模糊无法克服边缘像素信息丢死缺陷,原因是均值滤波是基于平均权重2、高斯模糊克服了均值模糊的缺陷,但无法完全避免,因为没有考虑像素值的不同
3、高斯双边模糊(双边滤波)是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变