欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

卷积

程序员文章站 2023-12-31 20:59:52
...
#include <stdio.h>

#define N1 8      //信号1的行
#define M1 10    //信号1的列
#define N2 2       //信号2的行
#define M2 3      //信号2的列

void conv2(int x[N1][M1],int y[N2][M2],int z[N1+N2-1][M1+M2-1])
{
 int i,j;
 int n,m;
 for(i=0;i<N1+N2-1;i++)
  for(j=0;j<M1+M2-1;j++)
  {
   int temp=0;
   for(m=0;m<N1;m++)
   {
    for(n=0;n<M1;n++)
    {
     if((i-m)>=0&&(i-m)<N2&&(j-n)>=0&&(j-n)<M2)
     {
      temp+=x[m][n]*y[i-m][j-n];
     }
    }
   }
   z[i][j]=temp;
  }
}

 

 

#include <stdio.h>
#define M1 3    //输入图像的行号
#define N1 3 //输入图像的列号 
#define M2 3    //卷积核的行号
#define N2 3 //卷积核的列号

int f[M1][N1] = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
int w[M2][N2] = { { 2, 2, 2 }, { 1, 1, 1 }, { 3, 3, 3 } };
int g[M1 + M2 - 1][N1 + N2 - 1] = {0};
int g2[M1][N1];

void conv(int f[M1][N1], int con[M2][N2], int g[M1+M2-1][N1+N2-1])
{
    int i, j, m, n;
    for (i = 0; i < M1 + M2 - 1; i++)
    {
        for (j = 0; j < N1 + N2 - 1; j++)
        {
            float temp = 0;
            for (m = 0; m < M1; m++)
            {
                for (n = 0; n < N1; n++)
                    if ((i - m) >= 0 && (i - m)<M2 && (j - n) >= 0 && (j - n)<N2)
                        temp += f[m][n] * con[i - m][j - n];
                g[i][j] = temp;
            }
        }
    }

    for (i = 0; i < M1; i++)
    {
        for (j = 0; j < N1; j++)
        {
            g2[i][j] = g[i + (M2 - 1)/2][j + (N2 - 1) / 2];
        }
    }
}


void main()
{
    conv(f, w, g);
    //输出卷积的结果
    for (int i = 0; i < M1+M2-1; i++)
    {
        for (int j = 0; j < N1+N2-1; j++)
        {
            printf("%2d ", g[i][j]);
        }
        printf("\n");
    }
    printf("\n\n");
    //图像处理中输出与输入维数相同的矩阵
    for (int i = 0; i < M1; i++)
    {
        for (int j = 0; j < N1; j++)
        {
            printf("%2d ", g2[i][j]);
        }
        printf("\n");
    }
    getchar();
}

 

上一篇:

下一篇: