日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

局部图像描述子——SIFT(尺度不变特征变换)

發(fā)布時(shí)間:2025/4/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 局部图像描述子——SIFT(尺度不变特征变换) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • SIFT(尺度不變特征變換)
    • 1 興趣點(diǎn)、描述子
    • 2 檢測興趣點(diǎn)
    • 3 匹配描述子
    • 4 總結(jié)

SIFT(尺度不變特征變換)

SIFT即尺度不變特征變換,是用于圖像處理領(lǐng)域的一種描述。這種描述具有尺度不變性,可在圖像中檢測出關(guān)鍵點(diǎn),是一種局部特征描述子。

SIFT算法的特點(diǎn)有:

  • SIFT特征是圖像的局部特征,其對旋轉(zhuǎn)、尺度縮放、亮度變化保持不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩(wěn)定性;
  • 獨(dú)特性好,信息量豐富,適用于在海量特征數(shù)據(jù)庫中進(jìn)行快速、準(zhǔn)確的匹配;
  • 多量性,即使少數(shù)的幾個物體也可以產(chǎn)生大量的SIFT特征向量;
  • 高速性,經(jīng)優(yōu)化的SIFT匹配算法甚至可以達(dá)到實(shí)時(shí)的要求;
  • 可擴(kuò)展性,可以很方便的與其他形式的特征向量進(jìn)行聯(lián)合。
  • SIFT算法可以解決的問題:
    目標(biāo)的自身狀態(tài)、場景所處的環(huán)境和成像器材的成像特性等因素影響圖像配準(zhǔn)/目標(biāo)識別跟蹤的性能。而SIFT算法在一定程度上可解決:

  • 目標(biāo)的旋轉(zhuǎn)、縮放、平移
  • 圖像仿射/投影變換
  • 光照影響
  • 目標(biāo)遮擋
  • 雜物場景
  • 噪聲
  • SIFT算法的實(shí)質(zhì)是在不同的尺度空間上查找關(guān)鍵點(diǎn)(特征點(diǎn)),并計(jì)算出關(guān)鍵點(diǎn)的方向。SIFT所查找到的關(guān)鍵點(diǎn)是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點(diǎn),如角點(diǎn)、邊緣點(diǎn)、暗區(qū)的亮點(diǎn)及亮區(qū)的暗點(diǎn)等。

    1 興趣點(diǎn)、描述子

    SIFT特征使用高斯差分函數(shù)來定位興趣點(diǎn):

    其中,Iσ是使用Gσ模糊的灰度圖像,κ是決定相差尺度的常數(shù)。興趣點(diǎn)是在圖像位置和尺度變化下D(x, σ)的最大值和最小值點(diǎn)。這些候選位置點(diǎn)通過濾波去除不穩(wěn)定點(diǎn)。基于一些準(zhǔn)則,比如認(rèn)為低對比度和位于邊上的點(diǎn)不是興趣點(diǎn),可以去除一些候選興趣點(diǎn)。

    SIFT描述子使用主方向描述參考方向。主方向使用方向直方圖來度量。

    為了對圖像亮度具有穩(wěn)定性,SIFT描述子使用圖像梯度。SIFT描述子在每個像素點(diǎn)附近選取子區(qū)域網(wǎng)格,在每個子區(qū)域內(nèi)計(jì)算圖像梯度方向直方圖。每個子區(qū)域的直方圖拼接起來自稱描述子向量。SIFT描述子的標(biāo)準(zhǔn)設(shè)置使用4*4的子區(qū)域,每個子區(qū)域使用8個小區(qū)間的方向直方圖,會產(chǎn)生共128個小區(qū)間的直方圖。

    2 檢測興趣點(diǎn)

    創(chuàng)建sift.py文件,將下面調(diào)用可執(zhí)行文件的函數(shù)添加到該文件中:

    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)

    由于該二進(jìn)制文件需要的圖像格式為灰度.pgm,所以如果圖像為其他格式,就需要將其轉(zhuǎn)換為.pgm文件。

    為了從輸出文件中將特征讀取到NumPy數(shù)組,使用如下函數(shù):

    def read_features_from_file(filename):f = loadtxt(filename)return f[:, :4], f[:, 4:]

    如果在Python會話中修改描述子,則需要將輸出的結(jié)果保存在特征文件中,下邊的函數(shù)使用NumPy中的savetxt()函數(shù)實(shí)現(xiàn)這一功能:

    def write_features_to_file(filename, locs, desc):savetxt(filename, hstack((locs, desc)))

    上邊用到的hstack()函數(shù)通過拼接不同的行向量來實(shí)現(xiàn)水平堆疊兩個向量的功能。

    讀取特征后,通過在圖像上繪制出他們的位置,將其可視化。

    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')

    該函數(shù)在原始圖像上使用藍(lán)色的點(diǎn)繪制出SIFT特征點(diǎn)的位置。將參數(shù)circle的選項(xiàng)設(shè)置成True,該函數(shù)將使用draw_circle()函數(shù)繪制出圓圈,圓圈的半徑為特征的尺度。

    最后,通過下邊的命令繪制出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角點(diǎn)進(jìn)行對比:

    圖1 對提取SIFT特征和Harris角點(diǎn)的對比

    通過對比可以看出,兩種方法提取到的興趣點(diǎn)的位置有所不同。

    3 匹配描述子

    對于將一幅圖像中的特征匹配到另一幅圖像的特征,一種穩(wěn)健的準(zhǔn)則是使用這兩個特征距離和兩個最匹配特征距離的比率。相比于圖像中的其他特征,該準(zhǔn)則保證能夠找到足夠相似的唯一特征,并使錯誤的匹配數(shù)降低。

    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

    該函數(shù)使用描述子向量間的夾角作為距離度量。在此之前,我們需要將描述子向量歸一化到單位長度。因?yàn)檫@種匹配是單向的,即我們將每個特征向另一幅圖像中的所有特征進(jìn)行匹配,所以可以先計(jì)算第二幅圖像興趣點(diǎn)描述子向量的轉(zhuǎn)置矩陣。

    為了進(jìn)一步增加匹配的穩(wěn)健性,可以再反過來執(zhí)行一次該步驟,用另外的方法匹配(從第二幅圖像的特征向第一幅圖像中的特征匹配。)最后僅保留同時(shí)滿足這兩種匹配準(zhǔn)則的對應(yīng)。

    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()

    下圖為兩張圖片檢測到的特征點(diǎn):

    圖2 SIFT檢測描述子

    得到的匹配結(jié)果如下圖所示:

    圖3 SIFT匹配描述子
    通過實(shí)驗(yàn)對比可以發(fā)現(xiàn)sift相比Harris的檢測效果更好,匹配效果也更好,sift匹配除去個別點(diǎn),其余特征點(diǎn)匹配的都很正確,但是Harris匹配的特征點(diǎn)較為雜亂。

    4 總結(jié)

    SIFT特征對于尺度、旋轉(zhuǎn)和亮度都具有不變性,因此可以用于三維視角和噪聲的可靠匹配。

    SIFT特征檢測基本步驟
    (1)尺度空間極值檢測:搜索所有尺度上的圖像位置。通過高斯微分函數(shù)來識別潛在的對于尺度和旋轉(zhuǎn)不變的興趣點(diǎn);
    (2)關(guān)鍵點(diǎn)定位:在每個候選的位置上,通過一個擬合精細(xì)的模型來確定位置和尺度。關(guān)鍵點(diǎn)的選擇依據(jù)于它們的穩(wěn)定程度;
    (3)方向確定,基于圖像局部的梯度方向,分配給每個關(guān)鍵點(diǎn)位置一個或多個方向。所有后面的對圖像數(shù)據(jù)的操作都相對于關(guān)鍵點(diǎn)的方向、尺度和位置進(jìn)行變換,從而提供對于這些變換的不變性;
    (4)關(guān)鍵點(diǎn)描述:在每個關(guān)鍵點(diǎn)周圍的鄰域內(nèi),在選定的尺度上測量圖像局部的梯度。這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變化。

    總結(jié)

    以上是生活随笔為你收集整理的局部图像描述子——SIFT(尺度不变特征变换)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。