圖像處理之C語言實現二維卷積

在用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

相關文章
相關標籤/搜索