前言
本文使用的环境为:Qt5.11 + OpenCV3.4.6
环境安装参考文档:https://blog.csdn.net/z634863434/article/details/89950961
概念
图像模糊从字面上理解,就是将一张清晰的图像变的模糊不清。在图像处理中,模糊可以理解为对每个像素进行滤波或者平滑处理,使得图像内部和边缘都变得平滑,边界不清晰。图像模拟主要可以用来突显出图像中的明显的特征点,通过模糊我们可以对图像进行特征点的提取或者做运动模糊的功能。而在做图像模糊处理时候,其本质为给图像进行降噪处理,在数学上使用的卷积方式实现,常用的有以下4种方法:均值滤波、高斯滤波、中值滤波以及双边滤波。
均值滤波(归一化盒子滤波)
均值滤波取掩模矩阵大小内所有像素点的平均值赋予给中心像素点,该方法对于边缘值无法进行处理。具体解释如下:
假设有6X6的图像像素点矩阵,在6X6矩阵上有一个3X3的小矩阵,依次从左右向右,再从上往下移动。将3X3矩阵中所有点求和取平均值后,赋值给3X3中的红点,向左移动直到将6X6图像中的像素点全部处理完成。
数学公式如下:
如上图1中心点数经过均值模糊后为(2+6+4+1+7+3+1+2+2)/ 9 = 3
API函数:
void cv::blur ( InputArray src,
OutputArray dst,
Size ksize,
Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT
)
作用:均值滤波,图像均值模糊处理
输入参数 | 参数定义 |
---|---|
src | 输入图像 |
dst | 输出图像 |
ksize | 模糊核大小 |
anchor | 锚点,(-1,-1)为中心点 |
borderType | 边框模式用于推断图像外部的像素 |
高斯滤波
高斯滤波对图像处理的过程与均值滤波类似,但高斯滤波符合正态分布,在计算矩阵值时,不再通过平均值的方法计算像素点,而是通过正态分布的方法进行计算,其本质上是对掩模矩阵中的所有像素值进行加权平均,虽然高斯滤波克服了部分丢失边缘像素的缺陷,但由于高斯滤波在计算时,不考虑像素值的不同,因此无法完全避免。
数学公式如下:
API函数:
void cv::GaussianBlur ( InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT
)
作用:高斯滤波,图像高斯模糊处理
输入参数 | 参数定义 |
---|---|
src | 输入图像 |
dst | 输出图像 |
ksize | 模糊核大小,但它们必须是正的和奇数的 |
sigmaX | X方向上的高斯核标准差 |
sigmaY | Y方向上的高斯核标准差 |
borderType | 边框模式用于推断图像外部的像素 |
中值滤波
高斯滤波对图像处理的过程与均值滤波类似,在计算矩阵值时,不再通过平均值的方法计算像素点,而是通过取中值的方法进行计算。该方法对于椒盐噪声(极大值、极小值)有很好的抑制作用,但对边缘化像素处理仍然不够完善。
如果一个3X3矩阵中为2、6、4、1、7、3、1、2、2,经过从小到大的排列1、1、2、2、2、3、4、6、7,则中值则取2,像素点赋值为2.
API函数:
void cv::medianBlur ( InputArray src,
OutputArray dst,
int ksize
)
作用:中值滤波,图像中值模糊处理
输入参数 | 参数定义 |
---|---|
src | 输入图像 |
dst | 输出图像 |
ksize | 孔径线性尺寸;它必须是奇数并且大于1 |
双边滤波
高斯双边滤波为了完善高斯滤波的缺点,是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓的不变。相对于只考虑空间核的高斯滤波,双边滤波加入了值域核,从而将像素值相差过大的值进行保留处理,其多数用于美艳照片上。
API函数:
void cv::bilateralFilter ( InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
)
作用:双边滤波,图像双边模糊处理
输入参数 | 参数定义 |
---|---|
src | 输入图像 |
dst | 输出图像 |
d | 用于滤波的每个像素邻域的直径,直径内的所有像素均会被纳入计算。如果它是非正数,则从sigmaSpace计算 |
sigmaColor | 决定多少差值内的像素会被计算 |
sigmaSpace | 如果d的值大于0则无效,否则会用来计算d的值 |
borderType | 边框模式用于推断图像外部的像素 |
示例
以均值滤波、高斯滤波、中值滤波、双边滤波采用5*5左右核对同一张图片进行模糊。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
#include <QtDebug>
using namespace cv;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Mat dstBlur;
Mat dstGaussianBlur;
Mat dstmedianBlur;
Mat dstbilateralFilter;
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
if(src.empty()){
qDebug()<<"can not load image...\n";
return ;
}
namedWindow("srcImage",CV_WINDOW_AUTOSIZE);
namedWindow("均值滤波",CV_WINDOW_AUTOSIZE);
namedWindow("高斯滤波",CV_WINDOW_AUTOSIZE);
namedWindow("中值滤波",CV_WINDOW_AUTOSIZE);
namedWindow("双边滤波",CV_WINDOW_AUTOSIZE);
//均值滤波
blur(src,dstBlur,Size(5,5));
//高斯滤波
GaussianBlur(src,dstGaussianBlur,Size(5,5),11,11);
//中值滤波
medianBlur(src,dstmedianBlur,5);
//双边滤波
bilateralFilter(src,dstbilateralFilter,5,100,3);
imshow("srcImage",src);
imshow("均值滤波",dstBlur);
imshow("高斯滤波",dstGaussianBlur);
imshow("中值滤波",dstmedianBlur);
imshow("双边滤波",dstbilateralFilter);
waitKey(0);
原图:
均值滤波:
高斯滤波:
中值滤波:
双边滤波: