OpenCV图像处理-模糊

  • 前言
  • 概念
  • 均值滤波(归一化盒子滤波)
  • 高斯滤波
  • 中值滤波
  • 双边滤波
  • 示例


前言

本文使用的环境为:Qt5.11 + OpenCV3.4.6
环境安装参考文档

概念

图像模糊从字面上理解,就是将一张清晰的图像变的模糊不清。在图像处理中,模糊可以理解为对每个像素进行滤波或者平滑处理,使得图像内部和边缘都变得平滑,边界不清晰。图像模拟主要可以用来突显出图像中的明显的特征点,通过模糊我们可以对图像进行特征点的提取或者做运动模糊的功能。而在做图像模糊处理时候,其本质为给图像进行降噪处理,在数学上使用的卷积方式实现,常用的有以下4种方法:均值滤波、高斯滤波、中值滤波以及双边滤波。

均值滤波(归一化盒子滤波)

均值滤波取掩模矩阵大小内所有像素点的平均值赋予给中心像素点,该方法对于边缘值无法进行处理。具体解释如下:

假设有6X6的图像像素点矩阵,在6X6矩阵上有一个3X3的小矩阵,依次从左右向右,再从上往下移动。将3X3矩阵中所有点求和取平均值后,赋值给3X3中的红点,向左移动直到将6X6图像中的像素点全部处理完成。

python opencv图像变清晰 opencv将模糊图片清晰化_Qt


数学公式如下:

python opencv图像变清晰 opencv将模糊图片清晰化_Qt_02


如上图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

边框模式用于推断图像外部的像素

高斯滤波

高斯滤波对图像处理的过程与均值滤波类似,但高斯滤波符合正态分布,在计算矩阵值时,不再通过平均值的方法计算像素点,而是通过正态分布的方法进行计算,其本质上是对掩模矩阵中的所有像素值进行加权平均,虽然高斯滤波克服了部分丢失边缘像素的缺陷,但由于高斯滤波在计算时,不考虑像素值的不同,因此无法完全避免。

数学公式如下:

python opencv图像变清晰 opencv将模糊图片清晰化_Qt_03


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

双边滤波

高斯双边滤波为了完善高斯滤波的缺点,是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓的不变。相对于只考虑空间核的高斯滤波,双边滤波加入了值域核,从而将像素值相差过大的值进行保留处理,其多数用于美艳照片上。

python opencv图像变清晰 opencv将模糊图片清晰化_OpenCV_04


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);

原图:

python opencv图像变清晰 opencv将模糊图片清晰化_Qt_05


均值滤波:

python opencv图像变清晰 opencv将模糊图片清晰化_图像_06


高斯滤波:

python opencv图像变清晰 opencv将模糊图片清晰化_图像_07


中值滤波:

python opencv图像变清晰 opencv将模糊图片清晰化_Qt_08


双边滤波:

python opencv图像变清晰 opencv将模糊图片清晰化_图像_09