1. 程式人生 > 其它 >【花朵識別】基於matlab模板匹配花朵分類【含Matlab原始碼 472期】

【花朵識別】基於matlab模板匹配花朵分類【含Matlab原始碼 472期】

一、簡介

1 概述
模式識別就是通過計算機,用數學模型求解的方法研究模式的自動處理和判讀。在模式識別的各種方法中,模板匹配是最容易的一種,其數學模型易於建立,通過模板匹配對數字影象模式識別有助於我們瞭解數學模型在數字影象中的應用。

2 模板匹配演算法
2.1 相似性測度求匹配
模板匹配的實際操作思路很簡單:拿已知的模板,和原影象中同樣大小的一塊區域去對。最開始時,模板的左上角點和影象的左上角點是重合的,拿模板和原影象中同樣大小的一塊區域去對比,然後平移到下一個畫素,仍然進行同樣的操作, ……所有的位置都對完後,差別最小的那塊就是我們要找的物體。

以上所描述的是相似性測度法求匹配的求解思路,其在計算機中操作的如圖2所示。設模板T疊放在搜尋圖上平移,被模板覆蓋搜尋圖下的那個影象叫做子圖Si , j,i , j 為這塊子圖的左上角畫素點在S圖的座標,稱為參考點,從圖2可知,i , j 的取值範圍是:1<i ,j <N- M+1. 現在可以比較T和Si , j的內容。若兩者一致,則T和S之差為零. 因此,可用下列公式(1) 和公式(2) 來衡量T和Si , j的相似程度。


在(2) 式中第3項表示模板總能量,是一個與(i , j) 無關的常數;第1項是模板覆蓋下子圖的能量,它隨著(i , j) 的位置緩慢地改變;第2項表示的子圖與模板的互相關係,隨著(i , j) 的改變而改變,當T和Si , j匹配時這項取值最大。因此可用下列相關函式(3) 作相似性測度。

當向量t 和S1之間的夾角為0時,即當S1(i , j) =kt 時(k為常量) ,有R(i , j) =1,否則R(i , j) <1. 顯然R(i , j) 越大,模板T和Si , j就越相似,點(i , j) 就是我們要尋找的匹配點。

2.2 序貫相似性檢測的演算法
用相關法求匹配的計算量很大,因為模板要在(N- M+1)2個參考位置上作相關計算,除了在匹配點外,其它點作的都是無用功。因此,人們提出一種叫序貫相似性檢測的演算法,簡稱SSDA(Sequential SimiliarityDetectionAlgorithm) 其要點是:
在數字影象中,SSDA法用公式(6) 計算影象f ( x, y) 在點(i , j) 的非相似度m(i , j) 作為匹配尺度。式中(i , j) 表示的不是模板中心座標,而是它左上角座標。模板的大小為n ×m。

如果在(i , j) 處影象中有和模板一致的圖案時,則m(i , j) 值很小,反之則很大。特別是模板和搜尋圖下的子圖部分,完全不一致的場合下,如果在模板內的各畫素與影象重合部分對應的畫素灰度差的絕對值依次增加,其和會急劇增大。 因此,在作加法時,如果灰度差的絕對值部分和超過某一閾值時,就認為這個位置不存在和模板一致的圖案,從而轉移到下一個位置上計算m(i , j)。並且在這模板下的各畫素點計算中止,因此能大幅度地縮短計算時間,提高匹配速度。
根據上述思路,我們可以進一步改進SSDA演算法。就是把在影象上的模板移動分為粗檢索和細檢索2個階段進行。首先進行粗檢索,它不是讓模板每次移動1個畫素,而是每隔若干的畫素把模板和影象重疊,並且計算匹配的尺度,從而求出待尋找的圖案大致存在的範圍。然後在這個範圍內,讓模板每隔1個畫素移動1次,根據匹配的尺度確定尋找圖案的所在位置。這樣,整體上計算模板匹配的次數減少了,計算時間縮短,匹配的速度提高了。但用這種方法具有漏掉影象中最恰當位置的危險性。

2.3 相關演算法
2個函式的相關性定義,可用公式(7)表示:

f*表示f 的複共軛。我們知道相關理論類似卷積理論,F( u, v) 和 H( u, v) 分別表示f ( x, y) 和h( x, y)的傅立葉變換. 根據卷積理論有

可知卷積是空間域過濾和頻率域過濾之間的紐帶。相關的重要用途在於匹配。在匹配中,f ( x, y) 是一幅包含物體或區域的影象。如果想要確定f 是否包含有感興趣的物體或區域,讓h( x, y) 作為那個物體的區域(通常稱該影象為模板)。如果匹配成功,2個函式的相關值會在h找到f 中相應點的位置上達到最大。從上面分析可知,相關演算法可以有2種方法:可在空間域進行,也可在頻率域進行。

2.4 幅度排序相關演算法
這種演算法有2個步驟組成:
第1步,把實時圖中的各個灰度值按幅度的大小排成列的形式,然後在對它進行二進位制(或三進位制) 編碼,根據二進位制排序的序列,把實時圖變換為二進位制陣列的一個有序的集合{ Cn, n =1,2, …, N}。這一過程稱之為幅度排序預處理。
第2步,序貫地將這些二進位制序列與基準圖進行由粗到細的相關,直到確定出匹配點為止。由於篇幅的限制,這裡就不列出例子了。

2.5 分層搜尋的序慣判決演算法
這種分層搜尋演算法是直接基於人們先粗後細尋找事物的慣例而形成的,例如,在中國地圖上找肇慶的位置時,可以先找廣東省這個地域,這過程稱為粗相關。然後在這個地域中,再仔細確定肇慶的位置,這叫做細相關。很明顯,利用這種方法,可以很快找出肇慶的位置。因為在這過程中省略了尋找廣東省以外區域所需的時間,這種方法稱為分層搜尋的序貫判決法,利用這種思想形成的分層演算法具有相當高的搜尋速度。限於篇幅,這裡只給出這種操作的一般思路。

3 總結
模式匹配本質就是應用數學。模板匹配過程如下:①將影象數字化,按順序取出每個點的畫素值;②代入事先建立的數學模型進行預處理;③選擇一種合適的演算法進行模式匹配;④將匹配後圖像的座標列出或直接在原圖顯示.。在模板匹配操作中最為關鍵的是如何建立數學模型,這是正確匹配的核心。

二、原始碼

%圖一:利用直方圖進行影象的匹配
%圖二:利用形狀進行影象的匹配
%交給你們啦~~~~
%-要求mo<=num
clear;
mo = 1;%-選取第?幅影象
num=5;%圖片總數量
distance_const=0.8;%設定直方圖距離
similar_const=0.5;%設定形狀匹配相似度
close all;
%獲取第一幅影象
sname='C:\Users\lenovo\Desktop\62858239matlab1(sxy)\matlab1(sxy)\';%統一修改儲存位置,修改路徑時只需在此步修改
ss=[sname,num2str(mo),'.jpg'] ; %開啟待匹配影象
f1=open_img(ss);                %求待匹配影象的累計直方圖
%選擇其它待匹配影象
distance=zeros(1,num);
for j=1:num
    sl=[sname,num2str(j),'.jpg']
    f2=open_img(sl);
    %進行直方圖的匹配
    d=zeros(1,256);
    for ii=1:256
        d(ii)=(sqrt((f1(ii)-f2(ii)).^2));
    end
    distance(j)=sum(d);
end

distance_num=mo;
for j=1:num
    if distance(j)>0
        if distance(j)<=distance_const
            distance_num=[distance_num,j];
        end
    end
end
%**************************************************************************
%****
disp('採用直方圖匹配,在給定的距離值以內的圖片名稱數為:');
distance_num
disp('採用直方圖匹配,在給定的距離值以內的圖片數目為:');
length(distance_num)
%**************************************************************************
figure(1)
num = length(distance_num);                              %查詢到的累積直方圖匹配的影象個數
ref =[sname,num2str(mo),'.jpg'];                         %待檢索的影象
ref_img = imread(ref);                                   %開啟影象
subplot(num+1,2,1);
imshow(ref_img);
title('待匹配影象')
h1=IMHISTS(ref_img);                                     %對原影象求取直方圖
subplot(num+1,2,2);
bar(h1,0.075,'b');
axis([0 255 0 4000]);
title('待匹配影象的直方圖');
for i = 1:num
    match = [sname,num2str(distance_num(i)),'.jpg'];     %資料庫影象
    match_img = imread(match);                           %開啟影象
    subplot(num+1,2,2*i+1);
    imshow(match_img);
    ttxt=sprintf('第%d匹配影象',i);title(ttxt);
    h2=IMHISTS(match_img);                               %對匹配影象求取直方圖
    subplot(num+1,2,2*i+2);
    bar(h2,0.075,'b');
    axis([0 255 0 4000]);
    ttxt=sprintf('第%d匹配影象直方圖',i);title(ttxt);
end
similar = ones(1,num);
rec_tang_1=center_rectangle(ref_img);
for i = 1:num
    match = [sname,num2str(distance_num(i)),'.jpg'];%資料庫影象
    match_img = imread(match);                                   %開啟影象
    rec_tang = center_rectangle(match_img);
    for j = 1:6
        similar(i) = similar(i) * (1- abs(rec_tang_1(j)-rec_tang(j)) / (rec_tang_1(j)+rec_tang(j)) );
    end
end
function result=center_rectangle(sdata)
%求取影象的中心矩

size(sdata);
[M,N]=size(sdata);
%***************
%m00,miu00,yibu00分別與公式中數字相互對應,並取其音譯
%***************
m00=0.0;
m10=0.0;
m01=0.0;

for i=1:M
    for j=1:N
        m00=m00+double(sdata(i,j));
        m10=m10+i*double(sdata(i,j));
        m01=m01+j*double(sdata(i,j));
    end
end
ave_x=m10/m00;
ave_y=m01/m00;
m00;
miu20=0.0;
miu02=0.0;
miu11=0.0;
miu12=0.0;
miu21=0.0;
miu30=0.0;
miu03=0.0;
%求取7箇中心矩
for i=1:M
    for j=1:N
        miu20=miu20+(i-ave_x).^2.*(j-ave_y).^0.*double(sdata(i,j));
        miu02=miu02+(i-ave_x).^0.*(j-ave_y).^2.*double(sdata(i,j));
        miu11=miu11+(i-ave_x).^1.*(j-ave_y).^1.*double(sdata(i,j));
        miu12=miu12+(i-ave_x).^1.*(j-ave_y).^2.*double(sdata(i,j));
        miu21=miu21+(i-ave_x).^2.*(j-ave_y).^1.*double(sdata(i,j));
        miu30=miu30+(i-ave_x).^3.*(j-ave_y).^0.*double(sdata(i,j));
        miu03=miu03+(i-ave_x).^0.*(j-ave_y).^3.*double(sdata(i,j));
    end
end
yibu20=miu20/(m00.^((2+0)/2+1));
yibu02=miu02/(m00.^((0+2)/2+1));
yibu11=miu11/(m00.^((1+1)/2+1));
yibu12=miu12/(m00.^((1+2)/2+1));
yibu21=miu21/(m00.^((2+1)/2+1));
yibu30=miu30/(m00.^((3+0)/2+1));
yibu03=miu03/(m00.^((0+3)/2+1));

三、執行結果


四、備註

版本:2014a

完整程式碼或代寫加1564658423