5-用任意线性滤波器做卷积

1-简介

我们接触到的卷积都是在OPENCV中的API内部实现的。在调用这些函数时,函数会默认选择某一种核,我们做的只是向函数传递一些参数来调用这个核。例如soboel等。

理论上我们只要用一个数组表示一个核,然后放进一个函数中,就可以用来做卷积了。例如
Mat kern = (Mat_(3,3) << 0, -1 ,0,
-1, 5, -1,
0, -1, 0);

2-用filter2D() 进行卷积

对于一幅图像卷积过程中的操作是十分巨大的,至少从第一印象来看操作数大概是图像中的像素数量乘以卷积核中的像素数,在OPENCV中提供一个函数代替:

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

参数含义如下:

InputArray src: 输入图像

OutputArray dst: 输出图像,和输入图像具有相同的尺寸和通道数量

int ddepth: 目标图像深度,如果没写将生成与原图像深度相同的图像。原图像和目标图像支持的图像深度如下:

    src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
    src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
    src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
    src.depth() = CV_64F, ddepth = -1/CV_64F

当ddepth输入值为-1时,目标图像和原图像深度保持一致。

InputArray kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。如果想在图像不同的通道使用不同的kernel,可以先使用split()函数将图像通道事先分开。

Point anchor: 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。

double delta: 在储存目标图像前可选的添加到像素的值,默认值为0

int borderType: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

3-示例代码

// opencv-45.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;


int main()
{
    Mat src = imread("1.jpg");
    if (src.empty()) {
        return -1;
    }
    imshow("src image", src);

    Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    Mat dst;
    filter2D(src, dst, -1, kernel, Point(-1, -1));
    imshow("dst image", dst);

    waitKey(0);
    return 0;
}


在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值