Matlab圖像處理學習筆記(六):基於sift特徵點的人民幣識別

本文記錄如何利用sift特徵點進行人民幣的識別。本文給出的matlab源碼識別了1元與100元人民幣的面額,相同思路,能夠對各類幣值的人民幣進行面額、正反面的識別。但因爲本程序採用串行,模板數的增多會致使運行時間線性增加,具體應用時你能夠採起並行的方法加以優化,本文只給出思路。算法

本文的sift特徵提取源碼採用的是David G. Lowe(sift提出者)提供的閉源程序。數組

本文涉及到知識點以下:app

一、sift特徵點提取。性能

二、基於歐式距離的特徵點匹配。(做者加上了最近距離與次近距離的比例來進一步篩選)測試

我在查閱sift的資料時,參閱了這篇博文:http://blog.csdn.net/abcjennifer/article/details/7639681優化

本文源碼的壓縮包我已傳至 個人博客資源,連接http://download.csdn.net/detail/u010278305/8356601點擊打開連接spa

轉載請註明出處:http://blog.csdn.net/u010278305.net

關於sift特徵點的簡要說明:rest

SIFT(Scale-invariant feature transform)是一種檢測局部特徵的算法,該算法經過求一幅圖中的特徵點(interest points,or corner points)及其有關scale 和 orientation 的描述子獲得特徵並進行圖像特徵點匹配,得到了良好效果,SIFT特徵不僅具備尺度不變性,即便改變旋轉角度,圖像亮度或拍攝視角,仍然可以獲得好的檢測效果。code

該算法流程以下:

一、讀取全部模板,並將其存放在一個cell裏。

二、讀取第一個模板。

三、讀取場景,並按不一樣比例進行縮放,縮放比例從小到大。

四、若是再繼續增大圖像,匹配點無明顯變化,則取上一次匹配獲得的匹配點數做爲最終的匹配點數目。

五、若是最終的匹配點數目,大於模板關鍵點數目的十分之一,則認爲已尋得匹配,跳出全部for循環,不然,讀取下一個模板,重複上述過程。

本算法主要源代碼(myapp.m)以下:

 

%function:
%       基於sift特徵點的人民幣識別
%注意:
%      因爲matlab沒有自帶sift特徵提取,sift特徵提取調用了該算法做者提供的底層調用。
%      matlab新版已集成surf特徵提取,surf特徵是基於sift改進的,提升了速度,但我的感受性能有所降低。(後續有可能給出測試)
%referrence:
%      David G. Lowe,Distinctive Image Features from Scale-Invariant Keypoints
%date:2015-1-13
%author:chenyanan
%轉載請註明出處:http://blog.csdn.net/u010278305

%清空變量,讀取圖像
clear;close all
fprintf('/******************************\n**It''s writed by chenyn2014.\n******************************/\n');

%讀取object1(模板1)
object1= imread('images/object1.jpg');
object1=rgb2gray(object1);

%讀取object100(模板2)
object100= imread('images/object100.jpg');
object100=rgb2gray(object100);

%讀取場景(你能夠自行更換場景圖片進行測試)
scene= imread('images/scene100.jpg');
scene=rgb2gray(scene);

%將全部的模板放在一個元胞數組中
object_cell={object1,object100};

%與全部模板作匹配(模板遍歷)
for i=1:2
    fprintf('\nobjec[ %d]\n\n',i);
    %提取第i個模板
    imwrite(object_cell{i},'tmp_images/obj_tmp.jpg');
    match_last=1;
    %從小到大縮放場景圖像,找到匹配數比較適合的縮放級別(縮放遍歷)
    for scale=0.1:0.1:0.5
        fprintf('\nscale[ %f]\n\n',scale);
        scene_tmp = imresize(scene, scale);
        imwrite(scene_tmp,'tmp_images/sce_tmp.jpg');
        %匹配
        [match_now,keypoint1,keypoint2]=match('tmp_images/sce_tmp.jpg','tmp_images/obj_tmp.jpg');
        %若是沒有找到關鍵點,繼續增大場景圖像
        if(match_now==0)
            match_now=1;
            continue;
        end
        %若是本次增大場景圖像後,本次尋得的關鍵點與上次比變化不大,
        %則認爲上次尋找的關鍵點數爲最終尋找到的關鍵點數,跳出縮放遍歷
        if(match_now/match_last<1.2&&scale>=0.2)
            match_num=match_last;
            break;
        end
        match_last=match_now;
    end
    %若是尋得的匹配點數大於模板關鍵點數的十分之一,則認爲已尋得匹配,跳出模板遍歷
    if(match_num>0.1*keypoint2)
        %打印識別結果
        fprintf('\nFound objec at objec[ %d]\n',i);
        break;
    end
end


運行效果以下(只給出部分輸出圖片):

 


程序運行時的輸出以下:

 

>> myapp
/******************************
**It's writed by chenyn2014.
******************************/

objec[ 1]


scale[ 0.100000]

Finding keypoints... 
543 keypoints found. 
Finding keypoints... 
287 keypoints found. 
Found 7 matches.

scale[ 0.200000]

Finding keypoints... 
1348 keypoints found. 
Finding keypoints... 
287 keypoints found. 
Found 12 matches.

scale[ 0.300000]

Finding keypoints... 
1898 keypoints found. 
Finding keypoints... 
287 keypoints found. 
Found 16 matches.

scale[ 0.400000]

Finding keypoints... 
2270 keypoints found. 
Finding keypoints... 
287 keypoints found. 
Found 17 matches.

objec[ 2]


scale[ 0.100000]

Finding keypoints... 
543 keypoints found. 
Finding keypoints... 
363 keypoints found. 
Found 18 matches.

scale[ 0.200000]

Finding keypoints... 
1348 keypoints found. 
Finding keypoints... 
363 keypoints found. 
Found 51 matches.

scale[ 0.300000]

Finding keypoints... 
1898 keypoints found. 
Finding keypoints... 
363 keypoints found. 
Found 43 matches.

Found objec at objec[ 2]

其中,最後一行爲識別結果,表示與模板2匹配,結果正確。

 


轉載請註明出處:http://blog.csdn.net/u010278305

本程序源碼已打包上傳:連接http://download.csdn.net/detail/u010278305/8356601點擊打開連接

相關文章
相關標籤/搜索