目录
一、前言
二、图像滤波
1、图像滤波
2、线性滤波器
三、OpenCV中的线型滤波操作
1、方框滤波——boxblur函数
2、均值滤波——blur函数
3、高斯滤波——GaussianBlur函数
今天要讲的是图像线性滤波原理与操作,图像滤波包括线性滤波与非线性滤波,今天我们要讲的是线性滤波,包括方框滤波、均值滤波与高斯滤波。
如果想看其他有关于OpenCV学习方法介绍、学习教程、代码实战、常见报错及解决方案等相关内容,可以直接看我的OpenCV分类:
【OpenCV系列】:https://blog.csdn.net/shuiyixin/article/category/7581855
如果你想了解更多有关于计算机视觉、OpenCV、机器学习、深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!
对于图像滤波的标准定义如下:
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
根据定义我们可以知道,图像滤波主要有如下两个目的:
(1)对图像进行降噪处理;
(2)提取图像中物体的特征。
图像滤波主要分为两类:线性滤波与非线性滤波。常用的线性与非线性滤波如下:
(1)线性滤波:方框滤波、均值滤波、高斯滤波;
(2)非线性滤波:中值滤波、双边滤波
线性滤波器经常用于剔除输入信号中不想要的频率或者从许多频率中选择一个想要的频率。几种常见的线性滤波器如下:
(1)低通滤波器:允许低频率的波通过。
(2)高通滤波器:允许高频率的波通过的。
(3)带通滤波器:允许一定范围频率的波通过。
(4)带阻滤波器:阻止一定范围频率的波通过并且允许其它频率的波通过。
(5)全通滤波器:允许所有频率的波通过、仅仅改变波的相位关系。
(6)陷波滤波器:阻止一个狭窄频率范围通过的特殊带阻滤波器。
通过不同的滤波器得到的图像不同。
(1)如果我们希望的是降低噪声,那我们需要的是将噪点除去,即需要模糊图像。
(2)如果我们希望的是提取特征,那我们需要的是使特征明显,即需要锐化图像。
所以模糊与锐化是图像经过滤波操作后的效果。
(1)如果经过低通滤波,更容易降低噪点,即效果是模糊效果。
(2)如果经过高通滤波,更容易显示特征,即效果是锐化效果。
void boxFilter(
InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor=Point(-1,-1),
boolnormalize=true,
int borderType=BORDER_DEFAULT
);
函数参数含义如下:
(1)InputArray类型的src,输入图像。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
(2)OutputArray类型的dst,即目标图像,与输入图像有相同的尺寸和类型。
(3)int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
(4)Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
(5)Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
(6)bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。
(7)int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("E:/image/Girl2.png");
if (!src.data)
{
cout << "could not load image !";
return -1;
}
imshow("src", src);
//方框滤波
boxFilter(src, dst, -1, Size(5, 5));
imshow("boxFilter_src", dst);
waitKey(0);
return 0;
}
void blur(
InputArray src,
OutputArray dst,
Size ksize,
Point anchor=Point(-1,-1),
int borderType=BORDER_DEFAULT
);
函数参数含义如下:
(1)InputArray类型的src,输入图像。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
(2)OutputArray类型的dst,即目标图像,与输入图像有相同的尺寸和类型。
(3)Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
(4)Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
(5)int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("E:/image/Girl2.png");
if (!src.data)
{
cout << "could not load image !";
return -1;
}
imshow("src", src);
//均值滤波
blur(src, dst, Size(3, 3), Point(-1, -1));
imshow("blur_src", dst);
waitKey(0);
return 0;
}
void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY=0,
intborderType=BORDER_DEFAULT
);
函数参数含义如下:
(1)InputArray类型的src,输入图像。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
(2)OutputArray类型的dst,即目标图像,与输入图像有相同的尺寸和类型。
(3)Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
(4)double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。
(5)double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
(6)int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("E:/image/Girl2.png");
if (!src.data)
{
cout << "could not load image !";
return -1;
}
imshow("src", src);
//高斯滤波
GaussianBlur(src, dst, Size(3, 3), 0, 0);
imshow("GaussianBlur_src", dst);
waitKey(0);
return 0;
}
好啦今天的内容就讲到这里啦,希望大家能够多多练习,才能真正学懂啊!