SIFT特征匹配處理


一、SIFT算法特征原理

SIFT即尺度不變特征轉換,它用來檢測圖像的局部性特征,在空間尺度中尋找極值點,提取這點的位置、尺度、旋轉不變量。這些關鍵點是一些十分突出,不會因光照和噪音等因素而變化的點,如角點、邊緣點、暗區的亮點及亮區的暗點等,所以與影像的大小和旋轉無關,對光線、噪聲、視角改變的容忍度也很高。

       SIFT特征檢測有四步:

1.尺度空間的極值檢測:搜索所有尺度空間上的圖像,通過高斯微分函數來識別潛在的對尺度和選擇不變的興趣點。

2.特征點定位:在每個候選的位置上,通過一個擬合精細模型來確定位置尺度,關鍵點的選取依據他們的穩定程度。

3.特征方向賦值:基於圖像局部的梯度方向,分配給每個關鍵點位置一個或多個方向,后續的所有操作都是對於關鍵點的方向、尺度和位置進行變換,從而提供這些特征的不變性。

4.特征點描述:在每個特征點周圍的鄰域內,在選定的尺度上測量圖像的局部梯度,這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變換。

 

二、SIFT特征匹配處理

  對兩張圖片進行SIFT特征匹配處理

    1.兩張差異較大的集美大學尚大樓

      原圖:

                              

                                           圖1                                                   圖2

 

      SIFT特征匹配:

      

                                                                     圖3

 

    2. 兩張差異較小的集美大學尚大樓

           原圖:

         

                               圖4                                                       圖5

 

 

      SIFT特征匹配:

      

 代碼:

 1 import io
 2 from PIL import Image, ImageTk
 3 import tkinter as tk
 4 
 5 import cv2
 6 import numpy as np
 7 MIN_MATCH_COUNT = 4
 8 
 9 img1 = cv2.imread("C:/Users/w/PycharmProjects/sift/picture/1.jpg")
10 img2 = cv2.imread("C:/Users/w/PycharmProjects/sift/picture/16.jpg")
11 g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
12 g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
13 sift = cv2.xfeatures2d.SIFT_create()
14 match = cv2.FlannBasedMatcher(dict(algorithm =2, trees =1), {})
15 kp1, de1 = sift.detectAndCompute(g1,None)
16 kp2, de2 = sift.detectAndCompute(g2,None)
17 m = match.knnMatch(de1, de2, 2)
18 m = sorted(m,key = lambda x:x[0].distance)
19 ok = [m1 for (m1, m2) in m if m1.distance < 0.7 * m2.distance]
20  med = cv2.drawMatches(img1, kp1, img2, kp2, ok, None)
21 
22 cv2.imwrite("C:/Users/w/PycharmProjects/sift/picture/b.jpg", med)
23 #
24 # cv2.imshow("0", med)
25 # cv2.waitKey()
26 # cv2.destroyAllWindows()
27 
28 
29 def resize(w, h, w_box, h_box, pil_image):
30     f1 = 1.0 * w_box / w  # 1.0 forces float division in Python2
31     f2 = 1.0 * h_box / h
32     factor = min([f1, f2])
33     width = int(w * factor)
34     height = int(h * factor)
35     return pil_image.resize((width, height), Image.ANTIALIAS)
36 
37 root = tk.Tk()
38 # size of image display box you want
39 # 期望圖像顯示的大小
40 w_box = 800
41 h_box = 1000
42 
43 # 以一個PIL圖像對象打開
44 pil_image = Image.open(r'C:/Users/w/PycharmProjects/sift/picture/b.jpg')
45 
46 # get the size of the image
47 # 獲取圖像的原始大小
48 w, h = pil_image.size
49 
50 # resize the image so it retains its aspect ration
51 # but fits into the specified display box
52 # 縮放圖像讓它保持比例,同時限制在一個矩形框范圍內
53 pil_image_resized = resize(w, h, w_box, h_box, pil_image)
54 
55 # convert PIL image object to Tkinter PhotoImage object
56 # 把PIL圖像對象轉變為Tkinter的PhotoImage對象
57 tk_image = ImageTk.PhotoImage(pil_image_resized)
58 
59 # put the image on a widget the size of the specified display box
60 # Label: 這個小工具,就是個顯示框,小窗口,把圖像大小顯示到指定的顯示框
61 label = tk.Label(root, image=tk_image, width=w_box, height=h_box)
62 # padx,pady是圖像與窗口邊緣的距離
63 label.pack(padx=5, pady=5)
64 root.mainloop()
SIFT Code

三、SIFT和Harris特征匹配處理的對比 

  例如,下圖是福建省廈門市集美大學的尚大樓的圖片:

        

用sift算法和Harris算法找到關鍵點並繪制關鍵點:  

                

                SIFT算法                          Harris算法

SIFT代碼:

 1 import cv2
 2 import numpy as np
 3 
 4 img = cv2.imread('C:/Users/w/PycharmProjects/untitled2/11.jpg')
 5 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 6 sift = cv2.xfeatures2d.SIFT_create()
 7 
 8 kp = sift.detect(gray, None)  # 找到關鍵點
 9 
10 img = cv2.drawKeypoints(gray, kp, img)  # 繪制關鍵點
11 
12 cv2.imshow('sp', img)
13 cv2.waitKey(0)
SIFT Code

Harris代碼:

 1 import cv2
 2 import numpy as np
 3 
 4 filename = 'C:/Users/w/PycharmProjects/sift/picture/11.jpg'
 5 
 6 img = cv2.imread(filename)
 7 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
 8 gray = np.float32(gray)
 9 #圖像轉換為float32
10 dst = cv2.cornerHarris(gray,2,3,0.04)
11 #result is dilated for marking the corners, not important
12 dst = cv2.dilate(dst,None)#圖像膨脹
13 # Threshold for an optimal value, it may vary depending on the image.
14 #print(dst)
15 #img[dst>0.00000001*dst.max()]=[0,0,255] #可以試試這個參數,角點被標記的多余了一些
16 img[dst>0.01*dst.max()]=[0,0,255]#角點位置用紅色標記
17 #這里的打分值以大於0.01×dst中最大值為邊界
18 
19 cv2.imshow('dst',img)
20 if cv2.waitKey(0) & 0xff == 27:
21     cv2.destroyAllWindows()
Harris Code

   SIFT特征檢測:SIFT從理論上說是一種相似不變量,即對圖像尺度變化和旋轉是不變量。然而,由於構造SIFT特征時,在很多細節上進行了特殊處理,使得SIFT對圖像的復雜變形和光照變化具有了較強的適應性,同時運算速度比較快,定位精度比較高。如:
  (1)在多尺度空間采用DOG算子檢測關鍵點,相比傳統的基於LOG算子的檢測方法,運算速度大大加快;
  (2)關鍵點的精確定位不僅提高了精度,而且大大提高了關鍵點的穩定性;
  (3)在構造描述子時,以子區域的統計特性,而不是以單個像素作為研究對象,提高了對圖像局部變形的適應能力;

  Harris特征檢測:在計算機視覺中,通常需要找出兩幀圖像的匹配點,如果能找到兩幅圖像如何相關,就能提取出兩幅圖像的信息。我們說的特征的最大特點就是它具有唯一可識別這一特點,圖像特征的類型通常指邊界、角點(興趣點)、斑點(興趣區域)。角點就是圖像的一個局部特征,應用廣泛。harris角點檢測是一種直接基於灰度圖像的角點提取算法,穩定性高,尤其對L型角點檢測精度高,但由於采用了高斯濾波,運算速度相對較慢,角點信息有丟失和位置偏移的現象,而且角點提取有聚簇現象。

四、遇到的問題:報錯:Read timed out

1.先下載opencv-python3.4.2.16,

直接在CMD命令窗口里輸入: pip install opencv-python==3.4.2.16

如果在安裝時報錯:

pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

那就在命令窗口里輸入:

pip install opencv-python==3.4.2.16 --default-timeout=1000

下載成功:

 

2.再下載opencv-contrib-python3.4.2.16,

輸入:

pip install opencv-contrib-python==3.4.2.16 --default-timeout=1000

下載成功:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM