美文网首页
C++实现卷积运算

C++实现卷积运算

作者: lxr_ | 来源:发表于2022-09-17 21:57 被阅读0次
#include <iostream>
#include <vector>

using namespace std;

/*
    5 6 3 3
    1 1 1 1 1 1
    1 2 2 2 2 1
    2 3 3 1 2 2
    1 2 2 3 4 5
    5 6 6 6 3 4
    1 10 1
    1 20 1
    1 8 1
*/

//图像卷积
int** CNN(int** image, int M, int N, int** kernel, int K, int L)
{
    int** cnn = new int* [M];

    int w = L / 2;
    int h = K / 2;

    for (int i = 1; i <= M; i++)
    {
        cnn[i - 1] = new int[N];
        for (int j = 1; j <= N; j++)
        {
            cnn[i - 1][j - 1] = 0;
            int beginRow = i - w;
            int beginCol = j - h;
            for (int x = beginRow; x <= i + w; x++)
            {
                for (int y = beginCol; y <= j + h; y++)
                {
                    cnn[i - 1][j - 1] += image[x][y] * kernel[x - beginRow][y - beginCol];
                }
            }

            if (cnn[i - 1][j - 1] < 0)
            {
                cnn[i - 1][j - 1] = 0;
            }
            else if (cnn[i - 1][j - 1] > 255)
            {
                cnn[i - 1][j - 1] = 255;
            }

        }
    }

    return cnn;
}

int main(int argc, char** argv)
{
    int M, N, K, L;
    cin >> M >> N >> K >> L;

    int w = L / 2;                      //边界的宽度
    int h = K / 2;                      //边界的高度

    int imageRow = M + 2 * h;           //扩充后的高度
    int imageCol = N + 2 * w;           //扩充后的宽度

    int** image = new int* [imageRow];  //图像

    for (int i = 0; i < imageRow; i++)
    {
        image[i] = new int[imageCol];
        for (int j = 0; j < imageCol; j++)
        {
            if (i < w || j < h || i > imageRow - w - 1 || j > imageCol - h - 1)
            {
                image[i][j] = 0;
            }
            else
            {
                cin >> image[i][j];
            }
        }
    }

    int** kernel = new int* [K];
    for (int i = 0; i < K; i++)
    {
        kernel[i] = new int[L];
        for (int j = 0; j < L; j++)
        {

            cin >> kernel[i][j];
        }
    }

    //卷积
    int** cnn = CNN(image, M, N, kernel, K, L);
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << cnn[i][j] << " ";
        }
        cout << endl;
    }

    for (int i = 0; i < M; i++)
    {
        delete[] image[i];
    }
    delete[] image;

    for (int i = 0; i < K; i++)
    {
        delete[] kernel[i];
    }
    delete[] kernel;

    for (int i = 0; i < M; i++)
    {
        delete[] cnn[i];
    }
    delete[] cnn;

    return 0;
}

相关文章

  • C++实现卷积运算

  • DFT与卷积

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

  • 2020-02-17

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

  • 第二次打卡 Task05

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

  • Task7 卷积神经网络

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

  • verilog实现卷积运算

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

  • 高效实现卷积运算

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

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

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

  • Tensorflow学习笔记--CNN

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

  • 卷积神经网络

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

网友评论

      本文标题:C++实现卷积运算

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