图像线性滤波
(1)图像卷积
卷积后的图像结果可能会出现负数或者超出255的情况,这种时候我们直接截断就可以了,对于负数可以直接取绝对值,
平滑,模糊,去噪,锐化,边缘提取其实都可以用卷积来实现。
OPenCV中利用filter2D()完成图像卷积操作
CV_EXPORTS_W void filter2D(
InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor=Point(-1,1),
double delta=0,
int borderType=BORDER_DEFAULT;
);
src:输入图像
dst:输出图像。输出图像和输入图像具有相同尺寸与通道数量。
ddepth:目标图像深度。当输入值为-1时,目标图像深度和源图像深度保持一致
kernel:卷积核,是一个矩阵。
Point anchor=Point(-1,1):内核的基准点。其默认值为(-1,1),说明基准点即核中与进行处理的像素点重合的点。
double delta=0:在储存目标图像前可选的添加到像素的值,默认值为0。
(2)均值滤波-----blur函数
void blur(
InputArray src,
OutputArray dst,
Size ksize,
Point anchor=Point(-1,-1),
int borderType=BORDER_DEFAULT
);
(1)src: 输入图像,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
(2)dst: 目标图像,与输入图像有相同的尺寸和类型。
(3)int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
(4)ksize : 内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
(5)anchor: 表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
代码演示:
void boxFilter_demo(Mat& img)
{
Mat dst;
boxFilter(img, dst,-1, Size(5, 5), Point(-1, -1));
imshow("滤波后", dst);
}
(3)方块滤波-----boxFilter函数
void boxFilter(
InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor=Point(-1,-1),
boolnormalize=true,
int borderType=BORDER_DEFAULT
);
(1)src: 输入图像,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
(2)dst: 目标图像,与输入图像有相同的尺寸和类型。
(3)int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
(4)ksize : 内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
(5)anchor: 表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
(6)normalize : 默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。
(7)borderType: 用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。
代码演示:
void blur_demo(Mat& img)
{
Mat dst;
blur(img, dst, Size(5, 5), Point(-1, -1));
imshow("滤波后", dst);
}
(4)高斯滤波----GaussianBlur函数
void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY=0,
intborderType=BORDER_DEFAULT
);
(1)src: 输入图像,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
(2)dst: 目标图像,与输入图像有相同的尺寸和类型。
(3)int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
(4)double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。
(5)double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
代码演示;
void gaussian_blur_demo(Mat& img)
{
Mat dst;
GaussianBlur(img, dst, Size(5,5),20);
imshow("gaussian_blur_demo", dst);
}
代码演示;
void QuickDemo::gaussian_blur_demo(Mat& img)
{
Mat dst;
GaussianBlur(img, dst, Size(5,5),20);
imshow("gaussian_blur_demo", dst);
}