局部图像描述子——SIFT(尺度不变特征变换)
文章目錄
- SIFT(尺度不變特征變換)
- 1 興趣點、描述子
- 2 檢測興趣點
- 3 匹配描述子
- 4 總結
SIFT(尺度不變特征變換)
SIFT即尺度不變特征變換,是用于圖像處理領域的一種描述。這種描述具有尺度不變性,可在圖像中檢測出關鍵點,是一種局部特征描述子。
SIFT算法的特點有:
SIFT算法可以解決的問題:
目標的自身狀態、場景所處的環境和成像器材的成像特性等因素影響圖像配準/目標識別跟蹤的性能。而SIFT算法在一定程度上可解決:
SIFT算法的實質是在不同的尺度空間上查找關鍵點(特征點),并計算出關鍵點的方向。SIFT所查找到的關鍵點是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區的亮點及亮區的暗點等。
1 興趣點、描述子
SIFT特征使用高斯差分函數來定位興趣點:
其中,Iσ是使用Gσ模糊的灰度圖像,κ是決定相差尺度的常數。興趣點是在圖像位置和尺度變化下D(x, σ)的最大值和最小值點。這些候選位置點通過濾波去除不穩定點。基于一些準則,比如認為低對比度和位于邊上的點不是興趣點,可以去除一些候選興趣點。
SIFT描述子使用主方向描述參考方向。主方向使用方向直方圖來度量。
為了對圖像亮度具有穩定性,SIFT描述子使用圖像梯度。SIFT描述子在每個像素點附近選取子區域網格,在每個子區域內計算圖像梯度方向直方圖。每個子區域的直方圖拼接起來自稱描述子向量。SIFT描述子的標準設置使用4*4的子區域,每個子區域使用8個小區間的方向直方圖,會產生共128個小區間的直方圖。
2 檢測興趣點
創建sift.py文件,將下面調用可執行文件的函數添加到該文件中:
def process_image(imagename, resultname, params = "--edge-thresh 10 --peak-thresh 5"):if imagename[-3:] != 'pgm':im = Image.open(imagename).convert('L')im.save('tmp.pgm')imagename = 'tmp.pgm'cmmd = str("sift "+imagename+" --output="+resultname+" "+params)os.system(cmmd)print('processed', imagename, 'to', resultname)由于該二進制文件需要的圖像格式為灰度.pgm,所以如果圖像為其他格式,就需要將其轉換為.pgm文件。
為了從輸出文件中將特征讀取到NumPy數組,使用如下函數:
def read_features_from_file(filename):f = loadtxt(filename)return f[:, :4], f[:, 4:]如果在Python會話中修改描述子,則需要將輸出的結果保存在特征文件中,下邊的函數使用NumPy中的savetxt()函數實現這一功能:
def write_features_to_file(filename, locs, desc):savetxt(filename, hstack((locs, desc)))上邊用到的hstack()函數通過拼接不同的行向量來實現水平堆疊兩個向量的功能。
讀取特征后,通過在圖像上繪制出他們的位置,將其可視化。
def plot_features(im, locs, circle = False):def draw_circle(c, r):t = arange(0, 1.01, .01) * 2 * pix = r * cos(t) + c[0]y = r * sin(t) + c[1]plot = (x, y, 'b', linewidth = 2)imshow(im)if circle:for p in locs:draw_circle(p[:2], p[2])else:plot(locs[:, 0], locs[:, 1], 'ob')axis('off')該函數在原始圖像上使用藍色的點繪制出SIFT特征點的位置。將參數circle的選項設置成True,該函數將使用draw_circle()函數繪制出圓圈,圓圈的半徑為特征的尺度。
最后,通過下邊的命令繪制出SIFT特征位置的圖像:
import siftimname = 'jimei.jpg' im1 = array(Image.open(imname).convert('L')) sift.process_image(imname, 'jimei.sift') l1, d1 = sift.read_features_from_file('jimei.sift')figure() gray() sift.plot_features(im, l1, circle=True) show()得到的圖像與提取Harris角點進行對比:
通過對比可以看出,兩種方法提取到的興趣點的位置有所不同。
3 匹配描述子
對于將一幅圖像中的特征匹配到另一幅圖像的特征,一種穩健的準則是使用這兩個特征距離和兩個最匹配特征距離的比率。相比于圖像中的其他特征,該準則保證能夠找到足夠相似的唯一特征,并使錯誤的匹配數降低。
def match(desc1, desc2):desc1 = array([d / linalg.norm(d) for d in desc1])desc2 = array([d / linalg.norm(d) for d in desc2])dist_ratio = 0.6desc1_size = desc1.shapematchscores = zeros((desc1_size[0], 1), 'int')desc2t = desc2.Tfor i in range(desc1_size[0]):dotprods = dot(desc1[i, :], desc2t)dotprods = 0.9999 * dotprodsindx = argsort(arccos(dotprods))if arccos(dotprods)[indx[0]] < dist_ratio * arccos(dotprods)[indx[1]]:matchscores[i] = int(indx[0])return matchscores該函數使用描述子向量間的夾角作為距離度量。在此之前,我們需要將描述子向量歸一化到單位長度。因為這種匹配是單向的,即我們將每個特征向另一幅圖像中的所有特征進行匹配,所以可以先計算第二幅圖像興趣點描述子向量的轉置矩陣。
為了進一步增加匹配的穩健性,可以再反過來執行一次該步驟,用另外的方法匹配(從第二幅圖像的特征向第一幅圖像中的特征匹配。)最后僅保留同時滿足這兩種匹配準則的對應。
def match_twosided(desc1, desc2):matches_12 = match(desc1, desc2)matches_21 = match(desc2, desc1)ndx_12 = matches_12.nonzero()[0]for n in ndx_12:if matches_21[int(matches_12[n])] != n:matches_12[n] = 0return matches_12 im1f = 'jimei_grey.jpg'im2f = 'jimei2.jpg'im1 = array(Image.open(im1f))im2 = array(Image.open(im2f).convert('L'))process_image(im1f,'jimei.sift')l1, d1 = read_features_from_file('jimei.sift')figure()gray()subplot(121)plot_features(im1, l1, circle=False)process_image(im2f, 'jimei2.sift')l2, d2 = read_features_from_file('jimei2.sift')subplot(122)plot_features(im2, l2, circle=False)matches = match_twosided(d1, d2)print ('{} matches'.format(len(matches.nonzero()[0])))figure()gray()plot_matches(im1, im2, l1, l2, matches)show()下圖為兩張圖片檢測到的特征點:
得到的匹配結果如下圖所示:
通過實驗對比可以發現sift相比Harris的檢測效果更好,匹配效果也更好,sift匹配除去個別點,其余特征點匹配的都很正確,但是Harris匹配的特征點較為雜亂。
4 總結
SIFT特征對于尺度、旋轉和亮度都具有不變性,因此可以用于三維視角和噪聲的可靠匹配。
SIFT特征檢測基本步驟
(1)尺度空間極值檢測:搜索所有尺度上的圖像位置。通過高斯微分函數來識別潛在的對于尺度和旋轉不變的興趣點;
(2)關鍵點定位:在每個候選的位置上,通過一個擬合精細的模型來確定位置和尺度。關鍵點的選擇依據于它們的穩定程度;
(3)方向確定,基于圖像局部的梯度方向,分配給每個關鍵點位置一個或多個方向。所有后面的對圖像數據的操作都相對于關鍵點的方向、尺度和位置進行變換,從而提供對于這些變換的不變性;
(4)關鍵點描述:在每個關鍵點周圍的鄰域內,在選定的尺度上測量圖像局部的梯度。這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變化。
總結
以上是生活随笔為你收集整理的局部图像描述子——SIFT(尺度不变特征变换)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 局部图像描述子——Harris角点检测器
- 下一篇: 计算机视觉编程——图像到图像的映射