SIFT影象特徵檢測的Python程式碼實現
1.主要內容
2.參考資料
主要參考資料為由朱文濤和袁勇翻譯的《python 計算機視覺》原書為《ProgrammingComputer Vision with Python》,該書主要內容包括Harris和sift的特徵檢測、影象到影象的對映、影象聚類、基於BoW的影象檢索等。譯本作者提供了全書實現的python程式碼,電子書及程式碼可在譯者袁勇的個人主頁中獲取,也可由以下百度網盤獲取:
本文主要針對SIFT特徵檢測這一部分的程式碼進行了整理。
3.準備工作
從VLFeat下載的檔案的子檔案bin中將<vl.dll><vl.lib><sift.exe>三個檔案拷貝出來,放到工程檔案目錄中
例如我的工程資料夾為../sift_python (程式sift.py所在資料夾),將上述三個檔案拷貝到sift_python資料夾中。
4.程式碼
在工程檔案中建立sift.py檔案,將下述程式碼依次拷貝到sift.py檔案中,在進行過簡單的路徑修改後即可執行。
以下為具體程式碼及註釋:
4.1 相關庫的匯入
from PIL import Image
from numpy import *
from pylab import *
import os
4.2 SIFT呼叫函式的定義
(1) 利用PIL中的convert將影象轉為灰度圖
在PIL中,對於彩色影象,open後都會轉換為“RGB”模式,然後該模式可以轉換為其他模式,比如“1”、“L”、“P”和“RGBA”,這幾種模式也可以轉換為“RGB”模式。模式“RGB”轉換為模式“1”以後,畫素點變成黑白兩種點,要麼是0,要麼是255。模式“RGB”轉換為模式“L”以後,畫素值為[0,255]之間的某個數值。模式“RGB”轉換為模式“P”以後,畫素值為[0,255]之間的某個數值,但它為調色盤的索引值,其最終還是彩色影象。此處利用convert('L') 將RGB影象轉為灰度值範圍為[0,255]的灰度圖,並以.pgm格式儲存
(2) 利用os.system()函式執行sift.exe檔案,SIFT中相應的輸入引數如下:
具體程式碼如下:
def process_image(imagename,resultname,params="--edge-thresh 10 --peak-thresh 5"): """ Process an image and save the results in a file. """ if imagename[-3:] != 'pgm': # create a pgm file im = Image.open(imagename).convert('L') #.convert('L') 將RGB影象轉為灰度模式,灰度值範圍[0,255] im.save('tmp.pgm') #將灰度值影象資訊儲存在.pgm檔案中 imagename = 'tmp.pgm' cmmd = str("E:\code\Sift\sift_python\sift.exe "+imagename+" --output="+resultname+ " "+params) os.system(cmmd) #執行sift可執行程式,生成resultname(test.sift)檔案 print 'processed', imagename, 'to', resultname
4.3 其它函式的定義
def read_features_from_file(filename):
""" Read feature properties and return in matrix form. """
f = loadtxt(filename)
return f[:,:4],f[:,4:] # feature locations, descriptors
filename即為生成的test.sift檔案,其內部儲存格式為:
上面資料的每一行前4 個數值依次表示興趣點的座標、尺度和方向角度,後面緊接著的是對應描述符的128 維向量。
def plot_features(im,locs,circle=True):
""" Show image with features. input: im (image as array),
locs (row, col, scale, orientation of each feature). """
def draw_circle(c,r):
t = arange(0,1.01,.01)*2*pi
x = 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() 函式繪製出圓圈,圓圈的半徑為特徵的尺度。
4.4 主函式的定義
imname為待處理照片的路徑,此處用的是絕對路徑,此處更改為相應處理照片的路徑即可:
if __name__ == '__main__':
imname = ('E:\\code\\Sift\\library.jpg') #待處理影象路徑
im=Image.open(imname)
process_image(imname,'test.sift')
l1,d1 = read_features_from_file('test.sift') #l1為興趣點座標、尺度和方位角度 l2是對應描述符的128 維向
figure()
gray()
plot_features(im,l1,circle = True)
title('sift-features')
show()
5. 執行結果
6.原始碼下載
本文所涉及的程式碼及VLFeat相關檔案均可在以下GitHub中獲取:
相關推薦
SIFT影象特徵檢測的Python程式碼實現
1.主要內容2.參考資料主要參考資料為由朱文濤和袁勇翻譯的《python 計算機視覺》原書為《ProgrammingComputer Vision with Python》,該書主要內容包括Harris和sift的特徵檢測、影象到影象的對映、影象聚類、基於BoW的影象檢索等。
影象特徵檢測描述(一):SIFT、SURF、ORB、HOG、LBP特徵的原理概述及OpenCV程式碼實現
什麼叫特徵檢測?就是檢測影象中目標的特徵唄,所謂特徵,不管你怎麼旋轉目標,離目標遠近,它的特徵都應不變才對,這兩個特性稱為叫旋轉不變性和尺度不變性。當然還有其它特徵,如光照不一樣,也不應該變化嘛,只是旋轉不變性和尺度不變性是最基本的兩個要求。 對特徵的描述有很多種方法和運算
基於C++和OpenCv的SIFT_影象區域性特徵檢測演算法程式碼的實現
SIFT:尺度不變特徵變換匹配演算法詳解 本章將要講解的內容如下所示: 1)SIFT演算法的簡介 2)SIFT演算法的實現細節 3)SIFT演算法的應用領域 4)SIFT演算法的改進與擴充套件 一 SIFT演算法的簡介 1)傳統的特徵提取方法 成
opencv影象特徵檢測及匹配(harris,sift,surf,fast,breif,orb,BFmatch,FlannBasedMatcher)
本文簡單概括各種演算法的提出背景及opencv實現,對具體原理不做討論一般而言,一個物體的角點最能夠代表物體的特徵,所以所謂的特徵檢測又叫角點(Corner)檢測harris是最早提出的特徵提取演算法:opencv實現如下:dst=cv2.cornerHarris(gray,
基於影象配準的影象特徵檢測之sift演算法----sift演算法總結
身為菜鳥的我,花了將近3個月的時間把sift演算法吃透並自己把演算法實現啦,實在是耗時耗力呀,為了對得起我這段時間的努力,決定把自己對sift演算法的理解和大家分享一下,有什麼錯誤望各位大神指教,小妹在此獻醜啦。 一 概念 sift---Scale Invari
Tensorflow 反捲積(DeConv)實現原理+ 手寫python程式碼實現反捲積(DeConv)
1、反捲積原理 反捲積原理不太好用文字描述,這裡直接以一個簡單例子描述反捲積。 假設輸入如下: [[1,0,1], [0,2,1], [1,1,0]] 反捲積卷積核如下: [[ 1, 0, 1], [-1, 1, 0], [ 0,-1, 0]]  
利用itchat 10行python程式碼實現微信轟炸
''' 轉載:https://github.com/Gin79/WeChat-Bomb/blob/master/README.md ''' 說明 站在巨人的肩膀上 基於python,這個小程式是用python寫的 使用的是python第三方庫itchat,itc
請寫出一段Python程式碼實現刪除一個list裡面的重複元素?
方法1:使用set函式 s=set(list),然後再list(s) 方法2:append 1 def delList(L): 2 L1 = [] 3 for i in L: 4
Redis訂閱&釋出以及python程式碼實現
A:命令列 伺服器端 192.168.1.168:7000> subscribe foo bar Reading messages... (press Ctrl-C&n
WGS84地球座標系轉火星座標系的Python程式碼實現
WGS84地球座標系轉火星座標系的Python程式碼實現 轉換演算法: from __future__ import division from math import pi, sqrt, sin, cos # a python binding of https://on4wp7.
[Python-程式碼實現]統計學習方法之感知機模型
內容簡介 感知機模型 - 手寫 Coding 使用手寫模型進行鳶尾花分類 使用 sklearn 中的感知機進行鳶尾花分類 感知機模型 - 手寫 Coding class Model: """感知機模型""" def __init__(s
模擬RSA雙向驗證,並且實現DES加密以及MD5校驗過程(python程式碼實現)
要求如下: (1)A,B兩端各生成公鑰金鑰對(PA,SA), 金鑰對(PB,SB)。 (2)A端生成隨機數N1,用B的公鑰PB加
一行Python程式碼實現交叉表資料分析!
我們在做資料分析的時候,可能經常會碰到分組統計彙總的情況,現成的工具和開放式的程式語言可以為我們完成分析任務提高效率。 對於很多不會程式設計的分析員來說,可能習慣了用Excel等工具來幫助他們達到彙總分析的目的。雖然效果也不錯,但過程相對繁瑣,而且侷限太大,只能在工具所能提供的功能下完成特定分析
Somte演算法和Python程式碼實現
SMOTE全稱是Synthetic Minority Oversampling Technique,即合成少數類過取樣技術。 它是基於隨機過取樣演算法的一種改進方案。 由於隨機過取樣採取簡單複製樣本的策略來增加少數類樣本,這樣容易產生模型過擬合的問題,即使得模型學習到的資
Fredholm第二類積分方程的Python程式碼實現-乘積積分法
本程式碼主要運用Product integration method實現Fredholm integral equations of the second kind的求解, 參見《The Numerical Solution of Integral Equations of
電商產品評論的資料情感分析python程式碼實現
步驟1:從爬取的資料中提取對應的評論資訊 #-*- coding: utf-8 -*- import pandas as pd inputfile = '.../huizong.csv' #評論彙總檔案 outputfile = '.../meidi_jd.t
二分法Python程式碼實現,迭代和非迭代法
1 看程式碼吧, #用迭代實現二分法 #寫個類吧 class Solution: def binarySearch(self, nums, target): return self.search(nums, 0, len(nums) - 1, target) de
歐拉回路,尤拉道路,七橋問題,Python程式碼實現
在尤拉道路中,進和出是對應的,除了起點和終點外,其他點的進出次數應該相等。也就是說,除起點和終點外其他各點的度數應該是偶數。 如果奇點不存在,則可以從任意點出發,最終一定會回到起點,稱為歐拉回路
神奇,幾行Python程式碼實現隨機生成生成優惠券
生活中我們到處搶優惠券,到處用到優惠券,彷彿一輸入類似“yxune1uaqc5”一串代號的優惠券,立刻感覺撿到大便宜。商家這些優惠券的編碼都是怎麼生成的呢? 學習Python中有不明白推薦加入交流群 &n
SVM原理_SVM分類和迴歸預測中的python程式碼實現
今天晚上有點惱火,花60大洋買了一本書,越來越替某些出書的作者擔憂(真想說一句,閉上你TM的那張臭嘴,別用良心去轉版權費),寫的真的是太糟糕了…….不知到是什麼支撐它寫下去的。不說了,回到上面的內容。 但還是要說幾點注意事項: (1)支援向量機它輸出的不是