线性滤波(卷积,均值滤波,方框滤波,高斯滤波)

图像线性滤波

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值