美文网首页
高效实现卷积运算

高效实现卷积运算

作者: coolTigers | 来源:发表于2020-04-27 00:49 被阅读0次

假设有如下锐化公式:
sharpened_pixel = 5 * current - left - right - up - down
代码实现如下:

void Sharpen(const cv::Mat& image, cv::Mat& result)
{
#ifndef _USE_KERNEL
    result.create(image.size(), image.type());
    int nchannels = image.channels();

    for (int i = 1; i < image.rows - 1; i++) {
        const uchar* previous = image.ptr<const uchar>(i - 1); // 上一行
        const uchar* current = image.ptr<const uchar>(i); // 当前行
        const uchar* next = image.ptr<const uchar>(i + 1); // 下一行
        uchar* output = result.ptr<uchar>(i);
        for (int j = 0; j < (image.cols - 1) * nchannels; j++) {
            // 应用锐化算子
            *output++ = cv::saturate_cast<uchar>(
                5 * current[j] - current[j - nchannels] - current[j + nchannels] - previous[j] - next[j]);
        }
    }
    result.row(0).setTo(cv::Scalar(0));
    result.row(result.rows - 1).setTo(cv::Scalar(0));
    result.col(0).setTo(cv::Scalar(0));
    result.col(result.cols - 1).setTo(cv::Scalar(0));
    return;
#endif // !_USE_KERNEL
    cv::Mat kernel(3,3,CV_32F, Scalar(0));
    kernel.at<float>(1, 1) = 5.0;
    kernel.at<float>(0, 1) = -1.0;
    kernel.at<float>(2, 1) = -1.0;
    kernel.at<float>(1, 0) = -1.0;
    kernel.at<float>(1, 2) = -1.0;
    cout << image.depth() << endl;
    cv::filter2D(image, result, image.depth(), kernel);
}

其中卷积函数:

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:目标图像的期望深度
kernel:卷积核
anchor:内核的锚点,表示内部经过过滤的点的相对位置内核;锚应该位于内核内;默认值(-1,-1)表示锚点在内核中心
delta:offset值,默认为0
borderType:边界填充的类型,在滤波的过程中,会根据滤波器的尺寸在图像的边界填充一定的数量的像素值,以保证输入与输出具有相同的尺寸,这个参数指定边界填充的规则;目前支持一下几种规则

enum BorderTypes {
    BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`
    BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
    BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`
    BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`
    BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
    BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`

    BORDER_REFLECT101  = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
    BORDER_DEFAULT     = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
    BORDER_ISOLATED    = 16 //!< do not look outside of ROI
};

参考博客:https://cloud.tencent.com/developer/article/1350371

相关文章

  • 高效实现卷积运算

    假设有如下锐化公式:sharpened_pixel = 5 * current - left - right - ...

  • DFT与卷积

    利用DFT可以大大加快卷积运算的速度。卷积定理:空间域的卷积运算可以转换为频域的乘法运算。具体实现是将图片转换到频...

  • 2020-02-17

    互相关运算与卷积运算 卷积层得名于卷积运算,但卷积层中用到的并非卷积运算而是互相关运算。我们将核数组上下翻转、左右...

  • 第二次打卡 Task05

    一、卷积神经网络基础 卷积层得名于卷积运算,但卷积层中用到的并非卷积运算而是互相关运算。我们将核数组上下翻转、左右...

  • Task7 卷积神经网络

    任务: 卷积运算的定义、动机(稀疏权重、参数共享、等变表示)。一维卷积运算和二维卷积运算。 反卷积(tf.nn.c...

  • verilog实现卷积运算

    本文转自本人csdn本文地址卷积是一种线性运算,是很多普通图像处理操作的基本算法之一。它提供了两个数组相乘的方式,...

  • AI数学基础29-数字图像卷积2

    在图像处理中,通过图像矩阵与精心设计的卷积核(Kernal)矩阵的卷积运算,可以实现模糊(blurring), 锐...

  • Tensorflow学习笔记--CNN

    输入向量----------------------》与卷积核卷积运算----------------------...

  • C++实现卷积运算

  • 卷积神经网络

    知识点 卷积运算图像处理中的卷积运算与数学定义中的卷积不太一样,更准确的是指数学中的互相关运算。输入二矩阵通过每个...

网友评论

      本文标题:高效实现卷积运算

      本文链接:https://www.haomeiwen.com/subject/fpcewhtx.html