OpenCV图像处理教程C++(九)图像模糊--线性滤波

模糊操作时图像处理中最简单和常用的操作之一,使用该操作的原因之一就为了给图像预处理时减低噪声。

Smooth/Blur是最常见的操作
背后公式:g(i,j)=就和f(i+k,j+l)h(k,l)
通常这些卷积算子计算都是线性操作,所以叫线性滤波。
假设有6x6的图像像素点矩阵。
卷积过程:6x6上面是个3x3的窗口(掩膜),从左向右,从上向下移动,每个像素点(除了中心点)值之和取平均值赋给中心点像素作为它卷积处理之后新的像素值。每次移动一个像素格。
对于边缘的处理,可以利用临近像素进行线性插值给空白的像素,然后再进行卷积计算(掩膜)
模糊原理:
同样的卷积因子,均值模糊会比高斯模糊更模糊些。 不管对于哪种模糊,卷积和(比如3*3)的大小最好是奇数。
归一化盒子滤波(均值滤波): 就是卷积计算,卷积算子(掩膜)中的格子权重都是1,所以卷积和之后还要除以卷积因子的大小取均值。
高斯滤波:高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程但是效率不是很高。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。 相比于均值滤波,权重是不一样,但是权重和为1,所以计算卷积和之后不用取均值了
均值滤波:
void blur(InputArray src,//输入图像,即源图像,填Mat类的对象即可
OutputArraydst,//即目标图像,需要和源图片有一样的尺寸和类型
Size ksize, //Size类型的ksize,内核的大小。
Point anchor=Point(-1,-1),//表示锚点(即被平滑的那个点),注意 他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
int borderType=BORDER_DEFAULT )//用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
高斯滤波:
void GaussianBlur(InputArray src,//输入图像,即源图像,填Mat类的对象即可
OutputArray dst,//即目标图像,需要和源图片有一样的尺寸和类型
Size ksize,//Size类型的ksize,内核的大小。
double sigmaX,//表示高斯核函数在X方向的的标准偏差。
double sigmaY=0,//表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来
intborderType=BORDER_DEFAULT )

代码:

#include <opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include <string> 
#include<fstream> 
using namespace cv;
using namespace std;

int main() {
    Mat src, dst,gdst;
    src = imread("C:\\Users\\Administrator\\Desktop\\pic\\5.jpg");
    imshow("input", src);
    blur(src, dst, Size(9, 9),Point(-1,-1));//均值模糊
    imshow("output", dst);
    GaussianBlur(src, gdst, Size(9, 9), 11, 11);//高斯模糊
    imshow("outputgaosi", gdst);
    waitKey(0);
}

结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_26907755/article/details/81668212