zoukankan      html  css  js  c++  java
  • 使用opencv实现自定义卷积

    对图像进行卷积是图像处理的基本操作,最近在研究图像滤波,经常要用到自定义卷积,所以实现了一下

     1 #include "opencv2/imgproc/imgproc.hpp"
     2 #include "opencv2/highgui/highgui.hpp"
     3 
     4 using namespace cv;
     5 
     6 Mat get_blur_kernel(int kernel_size);//获得归一化滤波的卷积核
     7 
     8 int main(int argc, char ** argv)
     9 {
    10     Mat src, dst;
    11     Point anchor;
    12     double delta;
    13     int ddepth;
    14     int kernel_size = 5;
    15     // 生成一个掩模核 大小为kernel_size*kernel_size,这里我们用归一化块滤波的卷积核做示例
    16     Mat kernel = get_blur_kernel(kernel_size);
    17     // 载入一张图片
    18     src = imread("a.jpg");
    19     if (!src.data)
    20         return -1;
    21 
    22     // 创建窗口
    23     imshow("before",src);
    24     waitKey(500);
    25     // 初始化滤波器参数
    26     anchor = Point(-1, -1);
    27     delta = 0;
    28     ddepth = -1;
    29     //将核设置好之后,使用函数 filter2D 就可以生成滤波器:
    30     filter2D(src, dst, ddepth, kernel, anchor, delta, BORDER_DEFAULT);
    31 
    32     imshow("after", dst);
    33     waitKey(0);
    34     return 0;
    35 }
    36 
    37 //生成归一化滤波的卷积核,通过对kernel.ptr(i)[j]的操作来进行
    38 Mat get_blur_kernel(int kernel_size)
    39 {
    40     Mat kernel = (Mat_<float>(kernel_size, kernel_size));
    41     for (int i = 0; i < kernel_size; i++)
    42     {
    43         for (int j = 0; j < kernel_size; j++)
    44             kernel.ptr<float>(i)[j] = 1.0 / (kernel_size*kernel_size);
    45     }
    46     return kernel;
    47 }

    卷积核kernel其实也是一个Mat对象,我们可以通过kernel.ptr(i)[j]实现对矩阵元素的直接操作,

    将核设置好之后,使用opencv提供的函数 filter2D 就可以生成滤波器:

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

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

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

    作者: Elliott Zheng

    出处: http://www.cnblogs.com/elliottzheng/p/6616869.htmlp/6664218.html>

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(elliott.zheng@foxmail.com)咨询.

  • 相关阅读:
    C++实现高斯滤波器
    移动通信
    最简单的DLL
    C/C++ 编译和链接过程
    Servlet 详解
    对 Java 集合的巧妙利用
    Java 泛型
    Java 字符编码与解码
    HTTP 400 错误
    a 标签的四种样式
  • 原文地址:https://www.cnblogs.com/elliottzheng/p/6616869.html
Copyright © 2011-2022 走看看