OpenCV-Python教程:36.SIFT(尺度不變特征變換)

理論

前幾節(jié)照雁,我們看到了Harris角點檢測蚕愤。他們是跟旋轉(zhuǎn)無關的,也就是說即使圖像旋轉(zhuǎn)了,我們還是可以找到相同的角萍诱。這是因為在旋轉(zhuǎn)的圖像里角還是角悬嗓。但是如果尺度發(fā)生變化呢?一個角可能就不是角了裕坊,比如包竹,下面的圖像,當一個角在小圖的窗口里是角籍凝,可是放大以后周瞎,在同樣窗口里就是平的了。所以Harris角不是尺度不變的饵蒂。

所以在2004年声诸,D.Lowe,提出了新的算法退盯,SIFT双絮,尺度不變特征變換,分解出關鍵點得问。

在SIFT算法里主要有四步:

1.尺度空間極值檢測

從上面的圖像可以知道我們不能用同樣的窗口在不同尺度下去檢測關鍵點囤攀。對于小角是可以的,但是要檢測大角我們需要大的窗口宫纬。我們使用尺度空間過濾焚挠。用多個σ值來找LoG(高斯-拉普拉斯算子),LoG由于σ的變換來在不同大小下檢測點漓骚,σ相當于尺度參數(shù)蝌衔。比如在上面的圖像里,σ小的高斯核給小角的值高而高σ的高斯核和大角符合的好蝌蹂。所以噩斟,我們可以找到尺度和空間的局部最大值,由(x, y, σ)列表給出孤个,表示在σ尺度下的潛在關鍵點(x剃允,y)。

但是這個LoG有點成本齐鲤,所以SIFT算法使用了不一樣的高斯算子斥废,用來近似LoG。不同的高斯算子是圖像兩個不同σ的不同高斯模糊的出來的给郊,這兩個σ 一個是σ一個是kσ牡肉。這個過程是在圖像金字塔的不同級別做的∠牛看下圖:

當找到了這個DoG统锤,會在尺度和空間里找圖像的局部最大值毛俏。比如,圖像里的一個像素和他周圍的8個像素比較饲窿,同樣還有上一層和下一層的9個像素拧抖,如果它是局部最大值,它就是個潛在關鍵點免绿,這就表明這個關鍵點最好被顯示在這一尺度唧席。

至于不同的參數(shù),論文里給出了經(jīng)驗數(shù)據(jù)嘲驾,層數(shù)是4淌哟,尺度級別5,初始化σ=1.6辽故, k=√2?

2. 關鍵點本地化

當潛在關鍵點位置被找到了徒仓,需要被精化得到更準確的結(jié)果,他們使用了泰勒展開得到極值更準確的位置誊垢,如果這個極值的強度比閾值械舫凇(論文里是0.03),就被拋棄喂走,這個閾值在OpenCV里被叫做對比度閾值

DoG對于邊緣有更高的響應殃饿,所以邊緣得被去掉,這里用了一個和Harris角點檢測類似的方法芋肠。他們使用2x2的Hessian矩陣來計算主要的彎曲乎芳,我們在Harris角點檢測里知道對于邊緣,一個特征值比另一個大帖池,所以這里他們用了簡單的函數(shù)

如果這個比率比閾值大奈惑,(在OpenCV里叫做邊緣閾值,)關鍵點就被拋棄睡汹,這個值在論文里給的是10.

所以它會消除掉任何低對比度的關鍵點和邊緣關鍵點肴甸,剩下的就是強點。

3.方向分配

現(xiàn)在給每個關鍵點分配一個方向以達到圖像旋轉(zhuǎn)不變囚巴。根據(jù)尺度取關鍵點位置周圍的一個鄰居原在,在這個區(qū)域內(nèi)計算梯度和方向。創(chuàng)建一個覆蓋306度的有30個bin的方向直方圖文兢。(用梯度幅值和關鍵點的尺度乘以1.5的σ值的圓形窗口高斯權(quán)重計算出權(quán)重)晤斩,取直方圖里的最高值,任何高于它的80%的值都用來計算方向姆坚,這創(chuàng)建同樣位置和尺度而不同方向的關鍵點。

4.關鍵點描述

現(xiàn)在創(chuàng)建了關鍵點描述实愚,取一個關鍵點周圍16x16的鄰居兼呵,它被分成16個4x4的塊兔辅。對于每個小塊,創(chuàng)建8bin的方向直方圖击喂,所以一個總共128bin的值就得到了维苔。除此之外,還要對一些光線變化懂昂,旋轉(zhuǎn)等因素的考慮來達到健壯性。

5.關鍵點匹配

兩個圖像之間的關鍵點匹配是識別他們周圍的鄰居凌彬,但有些情況下,第二近的可能和第一近的特別靠近铲敛,可能是由于噪點或者別的原因?qū)е隆_@種情況下工三,取最近的和第二近的比率先鱼。如果他們的比率大于0.8,就被拒絕段审,這會消除90%的錯誤匹配,只會丟掉5%的正確匹配闹蒜。

所以這就是SIFT算法了寺枉,記住,這個算法是有專利的绷落,所以這個算法在OpenCV里是在非免費模塊里姥闪。

OpenCV里的SIFT

所以現(xiàn)在讓我們看看OpenCV里的SIFT。讓我們開始關鍵點檢測并畫出他們砌烁,首先我們有一個SIFT對象的結(jié)構(gòu)筐喳,我們可以把不同參數(shù)傳給它。

import cv2
import numpy as np

img = cv2.imread('home.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT()
kp = sift.detect(gray,None)

img=cv2.drawKeypoints(gray,kp)

cv2.imwrite('sift_keypoints.jpg',img)

sift.detect()函數(shù)找到圖像的關鍵點函喉,你可以傳一個掩圖給它避归,如果你只想在圖像的一個部分內(nèi)搜索的話。每個關鍵點是一個特殊的結(jié)構(gòu)管呵,這些結(jié)構(gòu)有很多屬性梳毙,比如(x,y)坐標,有意義的鄰居的大小捐下,指定它們方向的角度账锹,指定關鍵點力量的響應等萌业。

OpenCV也提供了cv2.drawKeyPoints()函數(shù)來在關鍵點的位置畫上小圓圈,如果你傳入一個標志位奸柬,cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS生年,它會畫一個和關鍵點大小一樣的圓,還會顯示出它的方向廓奕。

img=cv2.drawKeypoints(gray,kp,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imwrite('sift_keypoints.jpg',img)


現(xiàn)在計算描述抱婉,OpenCV提供了兩個方法:

1.由于你已經(jīng)找到關鍵點了,你可以調(diào)用sift.computer()來計算我們找到的關鍵點的描述蒸绩,比如: kp, des = sift.compute(gray, kp)

2.如果你沒找關鍵點侵贵,直接用sift.detectAndCompute()一次直接找到關鍵點和描述。

sift=cv2.SIFT()
kp,des=sift.detectAndCompute(gray,None)

這里kp是關鍵點的列表漱抓,des是形狀數(shù)組

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仪或,隨后出現(xiàn)的幾起案子范删,更是在濱河造成了極大的恐慌,老刑警劉巖添忘,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異靶病,居然都是意外死亡娄周,警方通過查閱死者的電腦和手機煤辨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門鹃彻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谨履,“玉大人析蝴,你說我怎么就攤上這事√却” “怎么了啊奄?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵鞠眉,是天一觀的道長哗戈。 經(jīng)常有香客問我副渴,道長勉盅,這世上最難降的妖魔是什么宰闰? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钳吟,結(jié)果婚禮上直焙,老公的妹妹穿的比我還像新娘。我一直安慰自己诬留,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般甘穿。 火紅的嫁衣襯著肌膚如雪募判。 梳的紋絲不亂的頭發(fā)上释液,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天妄迁,我揣著相機與錄音登淘,去河邊找鬼耍鬓。 笑死界斜,一個胖子當著我的面吹牛各薇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播林螃,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疗认,長吁一口氣:“原來是場噩夢啊……” “哼谨设!你這毒婦竟也來了扎拣?” 一聲冷哼從身側(cè)響起二蓝,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤刊愚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厕九,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡扁远,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谷羞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湃缎。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蹂季,靈堂內(nèi)的尸體忽然破棺而出偿洁,到底是詐尸還是另有隱情父能,我是刑警寧澤何吝,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布瓣喊,位于F島的核電站藻三,受9級特大地震影響棵帽,放射性物質(zhì)發(fā)生泄漏逗概。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一铅搓、第九天 我趴在偏房一處隱蔽的房頂上張望星掰。 院中可真熱鬧蹋偏,春花似錦威始、人聲如沸黎棠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋捆。三九已至,卻和暖如春愤钾,著一層夾襖步出監(jiān)牢的瞬間能颁,已是汗流浹背劲装。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工纯赎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犬金,地道東北人晚顷。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓该默,卻偏偏與公主長得像栓袖,于是被迫代替她去往敵國和親音榜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容