图像特征点检测与匹配评价准则——量化
歡迎轉載,轉載請注明出處,謝謝!
目前圖像匹配中,局部特征匹配占據了絕大部分,常用的局部特征匹配方法有Harris、SIFT、SURF、ORB等等,不同的特征點檢測和匹配方法尤其獨特的優勢和不足;?
特征點匹配經過Ransac算法優化后仍存在錯誤匹配點對,需要優化后的匹配結果進行量化評價;?
特征點檢測和匹配評價一般包括兩個部分,分別為檢測和匹配的評價。
1、特征點檢測評價
評價特征點檢測方法的優劣常常用到repeatability(重復率)這個概念。?
《a performance evaluation of local descriptors》一文提出了特征點檢測器和匹配結果的評價準則,我的理解是:圖A、B是兩幅待匹配圖像,圖A映射到圖B有一個單應性矩陣H1,圖B映射到圖A有單應性矩陣H2,圖A檢測出N1個特征點,圖B檢測出N2個特征點,因為圖像A和B有部分圖像不重疊,故將A圖檢測的特征點坐標由H1算出在B圖的坐標,去掉不合格(計算結果超出在B圖像坐標)的特征點,剩下的特征點數記為n1;同樣,B圖的特征點經過處理剩下n2個;分母便是min(n1, n2)。將圖A剩下的特征點由H1計算出在圖B中的坐標,與圖B檢測出的特征點的坐標求距離,即dist(h1*a1, b1),若距離小于閾值ε,則認為是重復的,這么做是因為得到的單應性矩陣不一定完全精確以及一些別的誤差原因。
《An affine invariant interest point detector》中對repeatability定義進行了延伸,針對affine invariant的圖像特征點。?
repeatability計算式的分母可以和原來定義相同,分子的定義correspondence滿足兩個條件:?
1、同之前定義,即設定ε=1.5;?
2、regions映射到另一幅圖像中重疊誤差小于0.2。?
這里第二點是因為特征點檢測器得到的特征點實際上是根據特征點附近區域計算梯度來選取特征點,實際上檢測的特征區域(region),如Harris-Affine檢測的是一個橢圓區域,SIFT檢測的是一個圓形區域;當左圖一特征點區域在經過乘上單應性矩陣H后實際,該區域會發生變化,所以需要判斷變化之后的區域與右圖某一特征點區域的重疊誤差,誤差<0.2,則判斷自是一對特征點。?
2、特征點匹配評價
特征點匹配的評價一般涉及到兩個概念,即Recall(召回率)和Precision(精確率),我們先來了解一下這兩個概念。?
精確率和召回率是廣泛用于信息檢索和統計學分類領域的兩個度量值,用來評價結果的質量。?
——精確率是檢索出相關文檔數與檢索出的文檔總數的比率,衡量的是檢索系統的查準率;?
——召回率是指檢索出的相關文檔數和文檔庫中所有的相關文檔數的比率,衡量的是檢索系統的查全率。?
在信息檢索中:
- 精確率 = 提取出的正確信息條數 / 提取出的信息條數
- 召回率 = 提取出的正確信息條數 / 樣本中的信息條數
下面是一個非常經典的解釋Recall和Precision的圖,我做了一點兒說明:?
Precision和Recall指標有時候會出現的矛盾的情況,可以繪制Precision-Recall曲線,曲線越靠上部,結果越好。
對比信息檢索的評價,在特征點匹配時:?
A指的是實際為匹配點對,且該匹配算法得到了這些匹配對;?
B指的是實際為匹配點對,但該匹配算法沒有得到這些匹配對;?
C指的是實際為錯誤匹配對,但該算法得到了這些匹配對;?
即Precision為匹配結果中有多少是準確的,Recall就是所有正確的匹配結果有多少通過匹配算法得到了。
在第一部分中已經說明了根據兩圖像間的單應性矩陣H計算兩個特征點是否重復,這里設置一個correspondence變量,作為重復特征點的數量,則匹配結果評價的兩個參數Precision和Recall有如下公式:?
公式中,#correct matches表示匹配結果中正確匹配點對,#correspondences表示特征點檢測時重復特征點對(特征點重復即認為實際為正確匹配點對,但可能被匹配算法匹配上,也可能未匹配上),#false matches表示匹配結果中錯誤匹配點對。其中,正確與錯誤匹配點對可以用上面提到的兩個判斷特征點是否重復的條件來判定。
因此,在評價特征點匹配結果時,首先應當知道兩個圖像間的單應性矩陣H,然后通過特征點檢測算法得到左右圖像中的特征點信息,根據單應性矩陣得到重復特征點數,即#correspondences;接著由特征點匹配算法得到的匹配結果計算Precision和Recall,繪制1-precision和recall曲線,曲線靠上方的結果較出色!?
參考曲線圖:?
(圖片來源——《A Performance Evaluation of Local Descriptors》)
以上內容為我的理解,可能存在理解不當的地方,歡迎指正!
轉載請注明出處:圖像特征點檢測與匹配評價準則——量化
參考資料:?
介紹Precision和Recall的博客:?
http://blog.csdn.net/pirage/article/details/9851339?
http://bookshadow.com/weblog/2014/06/10/precision-recall-f-measure/?
文章《A Performance Evaluation of Local Descriptors》?
https://www.robots.ox.ac.uk/~vgg/research/affine/det_eval_files/mikolajczyk_pami2004.pdf?
K Mikolajczyk大神的特征點重復率計算相關代碼:?
http://www.robots.ox.ac.uk/~vgg/research/affine/descriptors.html#binaries?
特征點檢測匹配標準數據庫:?
http://www.robots.ox.ac.uk/~vgg/data/data-aff.html
研究特征提取的方法,找到提取出來的特征精度最高,這里的最高是指在多幀運動變化圖片里應用此算法都能找到固定位置的特征,而且這個特征不限,可以是邊緣、角點或區域塊等,然后根據不同特征、其運動變化及圖像成像質量提供不同的算法,以達到最優。這個方向剛開始的確十分頭大,完全不知道從什么著手,是邊緣提取算法呢?還是先作目標分割,大概想一兩天,決定先從特征點(包括角點)提取算法做起,先找到在特征點算法里非常優秀的,然后結合各種背景(噪聲,運動變化)測試其變化。
這里主要的思路來自于一個仿射不變特征提取方法的檢測:http://www.robots.ox.ac.uk/~vgg/research/affine/
這個網站上面主要提供了一個仿射不變特征提取方法的評估,它提供了八組圖片,分別從噪聲、模糊、視點變化、縮放、旋轉、亮度變化來評估其仿射不變特征提取方法的效果。不過它主要是對相似區域進行提取,涉及到橢圓區域的仿射變換,而我主要進行點特征點提取的評估,要稍微簡單點,當然也借鑒了其代碼(這里面只有評估代碼,沒有特征提取算法的代碼,不過提供了一系列算法的執行文件)
我首先要測試的sift算法對視點變化的評估,從上面的網站里下載了幾個圖片【img1.ppm、img2.ppm】、變化矩陣【H1to2p】及特征點提取文件【img1.haraff.sift】,我主要從特征向量匹配程度和實際匹配的位置進行比較。我的代碼如下:
- function [matchFeaIndex, matchFeaRatio,matchLocal1]=matchPointFea(file1,file2,H,image1,image2)
- % 主要用特征點匹配效果測試:
- % 用法:[matchFeaIndex, matchFeaRatio,matchLocal1]=matchPointFea('img1.haraff.sift','img2.haraff.sift','H1to2p','img1.ppm','img2.ppm');
- % 輸入:
- % file1 - 圖像1特征點檢測文件
- % file2 - 圖像2特征點檢測文件
- % H - 圖像1到圖像2的仿射變換矩陣
- % image1 - 圖像1
- % image2 - 圖像2
- % 輸出:
- % matchFeaIndex - 保存圖像1中同圖像2匹配的特征點在file2中的標號,若不匹配則為0。
- % matchFeaRatio - 對應于matchIndex,保存特征點匹配程度,不匹配則為0。
- % matchLocal1 - 保存圖像2中特征點位置同經過仿射變換1之間的位置差別
- % matchLocal2 - 保存圖像1中特征點位置同經過仿射變換2之間的位置差別(保留)
- % 特征點檢測文件格式:
- % file1, file2:
- % x1 y1 a1 b1 c1 c2 c3 ...
- % x2 y2 a2 b2 c1 c2 c3 ...
- %---------------------
- % 第一行 保存描述子數目及大小
- % x, y - 特征點位置
- % a, b - 特征點大小及方向(主要針對于sift變換)
- % d1 d2 d3 ... - 特征描述子向量(如果小于,則無效)
- close all;
- % loc存放位置及大小角度,des存放特征描述子向量,dimdesc存放描述子大小及數目
- [des1, loc1, dimdesc1]=loadFeatures(file1);
- [des2, loc2, dimdesc2]=loadFeatures(file2);
- % 導入圖像
- Im1=imread(image1);
- Im2=imread(image2);
- % 導入仿射矩陣文件
- H=load(H);
- fprintf(1,'numbers and length of descriptor in file1 %d %d\n',dimdesc1(1),dimdesc1(2));
- fprintf(1,'numbers and length of descriptor in file2 %d %d\n',dimdesc2(1),dimdesc2(2));
- if dimdesc1(2)>1 && dimdesc1(2)==dimdesc2(2)
- fprintf(1,'%s, %s look like files with descriptors...\n',file1,file2);
- else
- error('Different descriptor dimension in %s or %s files.',file1,file2);
- end
- % 計算兩個特征向量的匹配程度可以通過向量空間余弦相似度來衡量.
- % 設置比值distRatio,保證所匹配的特征點具有顯著相似度,即與第二相似度有較大差異.
- distRatio = 0.6;
- % 在圖像2中找到圖像1中每一個匹配點.
- des2t = des2'; % 轉置
- desNum = dimdesc1(1); % 圖像1特征點個數
- matchFeaIndex=zeros(desNum,1);
- matchFeaRatio=zeros(desNum,1);
- matchNum=0;
- for i = 1 : desNum
- dotprods = des1(i,:) * des2t; % 計算乘積項
- [vals,indx] = sort(acos(dotprods)); % 排序余弦相似度
- % 找到最大余弦相似度.
- if (vals(1) < distRatio * vals(2))
- matchFeaIndex(i) = indx(1);
- matchFeaRatio(i) = vals(1);
- matchNum=matchNum+1;
- else
- matchFeaIndex(i) = 0;
- end
- end
- fprintf(1,'numbers of match descriptor is %d \n',matchNum);
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 確定圖像1中特征點變換到圖像2中的位置,及圖像2變換到圖像1中的位置
- % 要進行仿射變換測試,要求圖像1和2必須大小相同
- if size(Im1)==size(Im2)
- HI=H(:, 1:3); %圖1到圖2
- H=inv(HI); %圖2到圖1
- fprintf(1,'Projecting 1 to 2...\n');
- loc1t=projectPoints(loc1',HI);
- loc1t=loc1t';
- fprintf(1,'and 2 to 1...\n');
- loc2t=projectPoints(loc2',H);
- loc2t=loc2t';
- ImageSize=size(Im1);
- matchLocal1=matchLocal(loc1t,loc2,ImageSize,matchFeaIndex);
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 畫圖
- % showkeys(image1,loc1); % 特征點顯示
- % showkeys(image2,loc2);
- % 顯示匹配圖像過程
- Im=appendimages(Im1,Im2);
- % Show a figure with lines joining the accepted matches.
- figure('Position', [0 0 size(Im,2) size(Im,1)]);
- colormap('gray');
- imagesc(Im);
- hold on;
- cols1 = size(Im1,2);
- for i = 1: size(des1,1)
- if (matchFeaIndex(i) > 0 && matchLocal1(i)<5)
- line([loc1(i,1) loc2(matchFeaIndex(i),1)+cols1], ...
- [loc1(i,2) loc2(matchFeaIndex(i),2)], 'Color', 'c'); %畫對應線條
- plot(loc1(i,1),loc1(i,2),'r.'); %畫特征點
- plot(loc2(matchFeaIndex(i),1)+cols1,loc2(matchFeaIndex(i),2),'g.'); %畫特征點
- end
- end
- hold off;
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 點的投影運算
- function loct=projectPoints(loc,H)
- num=size(loc(1)); %特征點數目
- loct=loc;
- for i=1:num
- l1=[loc(i,1),loc(i,2),1];
- l1_2=H*l1';
- l1_2=l1_2/l1_2(3);
- loct(i,1)=l1_2(1);
- loct(i,2)=l1_2(2);
- end
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 加載描述子文件
- function [des, loc, dimdes]=loadFeatures(file)
- fid = fopen(file, 'r');
- [dimdes, count]=fscanf(fid, '%d %d',[1 2]);
- if count ~= 2
- error('Invalid keypoint file beginning.');
- end
- num = dimdes(1); %描述子數目
- len = dimdes(2); %描述子長度
- loc = double(zeros(num, 4));
- des = double(zeros(num, len));
- % 將描述子導入向量
- for i = 1:num
- [vector, count] = fscanf(fid, '%f %f %f %f', [1 len+5]); %row col scale ori
- if count ~= (5+len)
- error('Invalid keypoint file format');
- end
- loc(i, :) = vector(1, 1:4);
- descrip(1, :) = vector(1, 6:len+5);
- descrip = descrip / sqrt(sum(descrip.^2));
- des(i, :) = descrip(1, :);
- end
- fclose(fid);
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 計算實際特征匹配的偏差位置
- function matchLoc=matchLocal(loct,loc,ImageSize,matchFeaIndex)
- matchLoc=ones(size(matchFeaIndex));
- for i=1:size(loct)
- if matchFeaIndex(i)~=0 %找到匹配的點
- %注意仿射變換,位置可能超過圖像范圍
- if loct(i,1)>0&&loct(i,1)<ImageSize(1)&&loct(i,2)>0&&loct(i,2)<ImageSize(2)...
- &&loc(matchFeaIndex(i),1)>0&&loc(matchFeaIndex(i),1)<ImageSize(1)&&loc(matchFeaIndex(i),2)>0&&loc(matchFeaIndex(i),2)<ImageSize(2)
- matchLoc(i)=(loct(i,1)-loc(matchFeaIndex(i),1))^2+(loct(i,2)-loc(matchFeaIndex(i),2))^2;
- matchLoc(i)=sqrt(matchLoc(i)); %這個偏差即是歐氏距離
- end
- end
- end
- matchLoc=100.*matchLoc./max(matchLoc); %計算百分比
- end
總結
以上是生活随笔為你收集整理的图像特征点检测与匹配评价准则——量化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧拉角和旋转矩阵相互转换
- 下一篇: 情侣网名微信