#include<stdio.h>
/*输入图像5*5
1 1 1 0 0
0 1 1 1 0
0 0 1 1 1
0 0 1 1 0
0 1 1 0 0
*/
/*卷积核大小3*3
1 0 1
0 1 0
1 0 1
*/
//padding :0 不填充
//step :1 步长
//单通道 单卷积
#define CONV_IMG_IN_SIZE 5
#define CONV_W_SIZE 3
#define CONV_IMG_OUT_SIZE 3
int conv(float img_in[CONV_IMG_IN_SIZE][CONV_IMG_IN_SIZE],float w[CONV_W_SIZE][CONV_W_SIZE],float img_out[CONV_IMG_OUT_SIZE][CONV_IMG_OUT_SIZE])
{
int i,j,k,r;
float temp;
//滑动卷积
for(k=0;k<CONV_IMG_OUT_SIZE;k++)//行
{
for(r=0;r<CONV_IMG_OUT_SIZE;r++)//列
{
//平面卷积计算
temp = 0.0;
for(i=0;i<CONV_W_SIZE;i++)//行
{
for(j=0;j<CONV_W_SIZE;j++)//列
{
temp += img_in[i+k][j+r] * w[i][j];
}
}
img_out[k][r] = temp ;
}
}
return 0 ;
}
void conv_test()
{
float img_in[CONV_IMG_IN_SIZE][CONV_IMG_IN_SIZE]={1,1,1,0,0,
0,1,1,1,0,
0,0,1,1,1,
0,0,1,1,0,
0,1,1,0,0};
float w[CONV_W_SIZE][CONV_W_SIZE]={1,0,1,
0,1,0,
1,0,1};
float img_out[CONV_IMG_OUT_SIZE][CONV_IMG_OUT_SIZE] ={0};
int i,j;
conv(img_in,w,img_out);
printf("输入图片:\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%.1f ",img_in[i][j]);
}
printf("\n");
}
printf("输出图片:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%.1f ",img_out[i][j]);
}
printf("\n");
}
}
int main()
{
conv_test();
return 0;
}