【圖像處理8】SIFT特徵

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import cv2

"""
SIFT 尺度不變特徵

1. 通過高斯模糊來獲取圖像金子塔:

    1.1 高斯模糊的前提認爲像素點與周圍的相似性關係滿足高斯分佈,即越近越像,因此有得到如下5*5高斯卷積核:

    kernel = [[0.015026, 0.028569, 0.035391, 0.028569, 0.015026],
              [0.028569, 0.054318, 0.067288, 0.054318, 0.028569],
              [0.035591, 0.067288, 0.082255, 0.067288, 0.035391],
              [0.028569, 0.054318, 0.067288, 0.054318, 0.028569],
              [0.015026, 0.028569, 0.035391, 0.028569, 0.015026]]

    1.2 用高斯模糊處理當前圖像後,進行1/2採樣;之後在重複該操作;

    1.3 結果形成一個金字塔,假設原圖爲512*512,則後續分別有

    層1(512*512), 層2(256*256), ...., 層9(1*1)


2. 構建高斯差分圖像(DOG)

    2.1 將高斯金字塔各層的圖像全部進行插值操作,回到512*512;

    2.2 將相鄰的兩張圖進行差分操作,例如L9/L8之間

    2.3 最終形成8張512 * 512的差分圖像

3. 空間極值點的檢測

    3.1 每一個尺度(理解應不包含第一層和最後一層)找空間極值點;

    3.2 這裏找的極值點除了找本層(如L2)的相鄰8個點,還有找(L1和L3)的18個點,相當於是
    一個三維立方體空間裏找極值點,這個機制點就是SIFT的特徵點備選

    3.3 由於當前的備選點不一定是真正精確的極值點,實際還通過基於這些點的擬合來獲取進一步真正的極值點,
    在擬合過程中通過閾值取出一些對比度低的點

    3.4 由於高斯差分算子的極值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的方向有較小的主曲率。
    DOG算子會產生較強的邊緣響應,需要剔除不穩定的邊緣響應點

4. 結論:

    通過SIFT算法得到的特徵點,在圖像放大、縮小、旋轉過程中都會保持不變


"""

path = '/XXX/'
img  = cv2.imread(path + 'logo.jpeg')
img_gray       = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

sift = cv2.xfeatures2d.SIFT_create()

# 計算出圖像的關鍵點和sift特徵向量
kp1, kv1 = sift.detectAndCompute(img_gray, None)
kp_mask = np.zeros(img_gray.shape)

w  = img_gray.shape[0]
h  = img_gray.shape[1]

for i in range(len(kp1)):

    x_idx = int(kp1[i].pt[0])
    y_idx = int(kp1[i].pt[1])

    if x_idx >= w or y_idx >= h:
        continue

    kp_mask[y_idx][
    x_idx] = 1

img[kp_mask == 1, 0] = 255


plt.imshow(img)
plt.show()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章