opencv自定义卷积核

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

Mat get_blur_kernel(int kernel_size);//获得归一化滤波的卷积核

int main(int argc, char ** argv)
{
    Mat src, dst;
    Point anchor;
    double delta;
    int ddepth;
    int kernel_size = 5;
    // 生成一个掩模核 大小为kernel_size*kernel_size,这里我们用归一化块滤波的卷积核做示例
    Mat kernel = get_blur_kernel(kernel_size);
    // 载入一张图片
    src = imread("a.jpg");
    if (!src.data)
        return -1;

    // 创建窗口
    imshow("before",src);
    waitKey(500);
    // 初始化滤波器参数
    anchor = Point(-1, -1);
    delta = 0;
    ddepth = -1;
    //将核设置好之后,使用函数 filter2D 就可以生成滤波器:
    filter2D(src, dst, ddepth, kernel, anchor, delta, BORDER_DEFAULT);

    imshow("after", dst);
    waitKey(0);
    return 0;
}

方法一:
//生成归一化滤波的卷积核,通过对kernel.ptr(i)[j]的操作来进行
Mat get_blur_kernel(int kernel_size)
{
    Mat kernel = (Mat_<float>(kernel_size, kernel_size));
    for (int i = 0; i < kernel_size; i++)
    {
        for (int j = 0; j < kernel_size; j++)
            kernel.ptr<float>(i)[j] = 1.0 / (kernel_size*kernel_size);
    }
    return kernel;
}

方法二:
Mat get_blur_kernel()
{
   Mat kernel;
   return kernel = (Mat_<char>(3, 3) << -1, -1, -1, -1, 8, -1, -1, -1, -1);
}

filter2D(src, dst, ddepth, kernel, anchor, delta, BORDER_DEFAULT);
其中各参数含义如下:

src : 源图像
dst : 目标图像
ddepth : dst 的深度。若为负值(如 - 1 ),则表示其深度与源图像相等。
kernel : 用来遍历图像的核
anchor : 核的锚点的相对位置,其中心点默认为(-1, -1) 。
delta : 在卷积过程中,该值会加到每个像素上。默认情况下,这个值为 0 。
BORDER_DEFAULT : 这里我们保持其默认值,更多细节将在其他教程中详解

只需改变卷积核,我们就可以使用类似的方法创造自定义滤波了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值