Gabor Filters對中文字圖片的特徵提取

中文字ocr是個比較討厭的事情,主要是因爲中文字繁多,光簡體字就有6000多個以上,雖然其中大部分簡體字是不常用的。對於這麼一個這麼大的,種類繁多的數據集,在分類的時候真心頭疼,看了很多paper後,發現現在的state of the art是基於gabor filters,通過這個過濾器,對一箇中文字的不同角度的比劃進行過濾,然後在每個subregion裏的每個角度的比劃進行統計之後生成一個histogram,和bag of words一樣,histogram可以用來對每個字進行分類或者用來尋找最近鄰。

gabor filters 是個複雜的東西,網上的方程各種各樣的,數學不好的小白就很難明白。在網上找了好多現成的函數之後,最後找到一個能用的matlab函數:


function gb=gabor_fn(rows,cols,sigma,theta,lambda,psi,gamma)
     
    sigma_x = sigma;
    sigma_y = sigma/gamma;
     
    % Bounding box
    nstds = 3;
    xmax = max(abs(nstds*sigma_x*cos(theta)),abs(nstds*sigma_y*sin(theta)));
    xmax = ceil(max(1,xmax));
    ymax = max(abs(nstds*sigma_x*sin(theta)),abs(nstds*sigma_y*cos(theta)));
    ymax = ceil(max(1,ymax));
    xmin = -xmax; ymin = -ymax;

    [x,y] = meshgrid(xmin:xmax,ymin:ymax);
    %[x,y] = meshgrid(-rows/2:rows/2-1,-cols/2:cols/2-1);

    % Rotation 
    x_theta=x*cos(theta)+y*sin(theta);
    y_theta=-x*sin(theta)+y*cos(theta);
    gb= exp(-.5*(x_theta.^2/sigma_x^2+y_theta.^2/sigma_y^2)).*cos(2*pi/lambda*x_theta+psi);

rows和cols是圖片的大小, sigma是gauss的那個sigma,越大的話周圍的pixels影響越大,theta要提取的比劃的角度,lambda這個貌似是什麼的長度(不明白啊),psi這裏沒用,gamma生成y_sigma。

通過改變theta這個角度值可以獲得不同角度比劃的信息。


I = imread('~/Desktop/11.png')
J = rgb2gray(I);
K = imresize(J,[64,64])
gb=gabor_fn(64,64,1.2,theta,5,0,1)

這裏的theta分別是pi/2, pi/4, pi和 3*pi/4 這個四個值,他們可以分別抓取中文字比劃的那8個方向。下面就是這個函數能產生的效果

衝上面的圖就能看出這個過濾器的威力,過濾圖片之後,我們可以對每個圖片其中某個的區域的點陣進行統計,這樣生成一個histogram,通過histogram可以有效的對每個字進行區分。

在我的試驗中,我用了16個1616大小的方格作爲第一次層histogram數組,然後在它的上面又疊加了9個1616的數組,總共是一個長(16+9)*4 = 100的數組。這麼長的數組以後還的進行pca或者lda什麼。實驗在進行中。。。

轉自:http://kkx.github.io/blog/2012/06/28/gabor-filtersdui-zhong-wen-zi-tu-pian-de-te-zheng-ti-qu/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章