在用C语言实现图像处理中,常常要用到二维卷积的运算,这个在matlab中是很是容易实现的,只须要conv2()就OK啦,并且速度很是的快。可是在C语言中就须要四层的for循环来实现了。.net
首先二维卷积的原理是:blog
1 2 3 2 2 2for循环
A= 1 2 3 B= 1 1 1图像处理
1 2 3 3 3 3原理
单咱们使用A和B卷积时,首先须要将B旋转180度。即循环
3 3 3float
1 1 1 逐渐右移程序
2 2 2协议
1 2 3语言
1 2 3
1 2 3
可得(full):
2 6 12 10 6
3 9 18 15 9
6 18 36 30 18
4 12 24 20 12
3 9 18 15 9
可是咱们在图像处理中通常只选择与A维数相同的矩阵即:
9 18 15
18 36 30
12 24 20
因此能够得如下程序(给出部分代码):
#define N1 512
#define M1 512
#define N2 3
#define M2 3
/*x至关于矩阵A,y至关于J矩阵B,z至关于矩阵full时的输出,z2至关于矩阵与A维数相同时的输出,这里的参数类型根据实际状况做出修改。若是矩阵很大,运算时间比较久*/
void conv2(unsigned char x[N1][M1],int y[N2][M2],float z[N1+N2-1][M1+M2-1],float z2[N1][M1])
{
int i,j;
int n,m;
for(i=0; i<N1+N2-1; i++)
for(j=0; j<M1+M2-1; j++)
{
float 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;
}
for(i=0; i<N1; i++)
for(j=0; j<M1; j++)
{
z2[i][j]=z[i+(N2-1)/2][j+(M2-1)/2];
}
}
————————————————版权声明:本文为CSDN博主「No威_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/gotowu/article/details/48806397