1. 程式人生 > >SIFT影象特徵檢測的Python程式碼實現

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)支援向量機它輸出的不是