二維卷積運算與gabor函式

2021-09-06 04:13:04 字數 4322 閱讀 9588

gabor

變換的本質實際上還是對二維影象求卷積。因此二維卷積運算的效率就直接決定了

gabor

變換的效率。在這裡我先說說二維卷積運算以及如何通過二維傅利葉變換提高卷積運算效率。在下一步分內容中我們將此應用到

gabor

變換上,抽取筆跡紋理的特徵。

關於離散二維疊加和卷積的運算介紹的書籍比較多,我這裡推薦

william k. pratt

著,鄧魯華

張延恒等譯的《數字影象處理(第

3版)》,其中第

7章介紹的就是這方面的運算。為了便於理解,我用下面幾個圖來說明離散二維疊加和卷積的求解過程。

a可以理解成是待處理的筆跡紋理,

b可以理解成

gabor

變換的核函式,現在要求a與

b的離散二維疊加卷積,我們首先對

a的右邊界和下邊界填充0(

zero padding)

,然後將

b進行水平翻轉和垂直翻轉,如下圖:

然後用b

中的每個值依次乘以

a中相對位置處的值並進行累加,結果填入相應位置處(注意紅圈位置)。通常二維卷積的結果比a、

b的尺寸要大。如下圖所示:

根據傅利葉變換理論,對影象進行二維卷積等價於對影象的二維傅利葉變換以及核函式的二維傅利葉變換在頻域求乘法。通過二維傅利葉變換可以有效提高卷積的運算效率。但在進行傅利葉變換時一定要注意

「捲繞誤差效應

」,只有正確對原有影象以及卷積核填補零後,才能得到正確的卷積結果。關於這部分內容可以參考

william k. pratt

著,鄧魯華

張延恒等譯的《數字影象處理(第

3版)》第9

目前網上可以找到開源

c#版的快速傅利葉變換**(

exocortex.dsp

),我使用的是

1.2版,

2.0版似乎只能通過

cvs從

sourceforge

上簽出,

並且功能沒有什麼太大改變。將

exocortex.dsp

using system;

using exocortex.dsp;

class mainentry

}

public class fftconv2

, 

};

double[,] data = ,

,

,

,

};

complex kernel = new complex[8*8];

complex data = new complex[8*8];

complex result = new complex[8*8];

private void init()

public void dofftconv2()

", result[y*8+x].re);

console.writeline();

}

}

}

程式的執行結果與離散二維疊加和卷積的運算結果完全相同。

由於卷積結果與原始輸入的大小是不一樣的,存在著所謂「邊界

」,在我的實際應用程式中,為了避免這些「邊界

」對結果過多的影響,我採用的是居中陣列定義,並且從卷積結果中只擷取需要的那部分內容,確保和原始的大小完全一致,如下圖:

using system;

using exocortex.dsp;

class mainentry

}

public class centerfftconv2

, 

,

};

double[,] data = new double[12,12];

complex kernel = new complex[16*16];

complex data = new complex[16*16];

complex result = new complex[16*16];

public centerfftconv2()

public void dofftconv2()

", result[y*16+x].getmodulus());

console.writeline();

}

}

public void commonmethod()

}

console.write("", real);

real=0;

}

console.writeline();

}

console.writeline("\n");

}

}

有了此部分的基礎知識後,我們就要步入筆跡識別中最核心的部分

gabor

變換,提取筆跡的特徵了。

gabor

變換屬於加窗傅利葉變換,

gabor

函式可以在頻域不同尺度、不同方向上提取相關的特徵。另外

gabor

函式與人眼的生物作用相仿,所以經常用作紋理識別上,並取得了較好的效果。二維

gabor

函式可以表示為:

其中: v

的取值決定了

gabor

濾波的波長,

u的取值表示

gabor

核函式的方向,

k表示總的方向數。引數

決定了高斯視窗的大小,這裡取

。程式中取

4個頻率(

v=0, 1, ..., 3),8

個方向(即

k=8,u=

0, 1, ... ,7

),共32

個gabor

核函式。不同頻率不同方向的

gabor

函式可通過下圖表示:

gaborfilter.html

gabor

函式是復值函式,因此在運算過程中要分別計算其實部和虛部。**如下:

private void calculatekernel(int orientation, int frequency)

}

private double kernelrealpart(int x, int y, int orientation, int frequency)

private double kernelimgpart(int x, int y, int orientation, int frequency)

有了

gabor

核函式後就可以採用前文中提到的

「離散二維疊加和卷積」或

「快速傅利葉變換卷積

」的方法求解

gabor

變換,並對變換結果求均值和方差作為提取的特徵。32個

gabor

核函式對應

32次變換可以提取

64101×101

尺寸的gabor

函式變換,得到均值和方差。**採用兩種卷積計算方式,從結果中可以看出,快速傅利葉變換卷積的效率是離散二維疊加和卷積的近

50倍。

(程式**在

visual studio .net 2003

下除錯通過)。

二維矩陣與二維矩陣之間的卷積

最近在學習數字影象處理 digital image processing,dip 這門課,感覺有些吃力。由於在數字訊號處理 digital singal processing,dsp 這門課中只學了一維矩陣之間的卷積運算。假設我們的卷積核h為kernel矩陣 33 待處理矩陣f x,y 為 55 h...

二維卷積詳細解釋

其中,矩陣a和b的尺寸分別為ma na即mb nb 對矩陣a補零,第一行之前和最後一行之後都補mb 1行,第一列之前和最後一列之後都補nb 1列 注意conv2不支援其他的邊界補充選項,函式內部對輸入總是補零 之所以都是 1是因為卷積核要在影象a上面移動,移動的時候需要滿足兩者至少有一列或者一行是重...

5 1 二維卷積層

卷積神經網路 convolutional neural network 是含有卷積層 convolutional layer 的神經網路 二維互相關運算 通常在卷積層中使用更加直觀的互相關 cross correlation 運算,在二維卷積層中,乙個二維輸入陣列和乙個二維核 kernel 陣列通過...