圖像特徵能夠包括顏色特徵、紋理特徵、形狀特徵以及局部特徵點等。其中局部特色具備很好的穩定性,不容易受外界環境的干擾。圖像特徵提取是圖像分析與圖像識別的前提,它是將高維的圖像數據進行簡化表達最有效的方式,從一幅圖像的的數據矩陣中,咱們看不出任何信息,因此咱們必須根據這些數據提取出圖像中的關鍵信息,一些基本元件以及它們的關係。html
圖像局部特徵描述的核心問題是不變性(魯棒性)和可區分性。因爲使用局部圖像特徵描述子的時候,一般是爲了魯棒地處理各類圖像變換的狀況。所以,在構建/設計特徵描述子的時候,不變性問題就是首先須要考慮的問題。在寬基線匹配中,須要考慮特徵描述子對於視角變化的不變性、對尺度變化的不變性、對旋轉變化的不變性等;在形狀識別和物體檢索中,須要考慮特徵描述子對形狀的不變性。python
局部特徵點是圖像特徵的局部表達,它只能反應圖像上具備的局部特殊性,因此它只適合於對圖像進行匹配,檢索等應用。對於圖像理解則不太適合。然後者更關心一些全局特徵,如顏色分佈,紋理特徵,主要物體的形狀等。全局特徵容易受到環境的干擾,光照,旋轉,噪聲等不利因素都會影響全局特徵。相比而言,局部特徵點,每每對應着圖像中的一些線條交叉,明暗變化的結構中,受到的干擾也少。算法
對於局部特徵的檢測,一般使用局部圖像描述子來進行。數據庫
斑點與角點是兩類局部特徵點。斑點一般是指與周圍有着顏色和灰度差異的區域,如草原上的一棵樹或一棟房子。它是一個區域,因此它比角點的抗噪能力要強,穩定性要好。而角點則是圖像中物體的拐角或者線條之間的交叉部分。編程
斑點檢測的方法主要包括利用高斯拉普拉斯算子檢測的方法(LOG),以及利用像素點Hessian矩陣(二階微分)及其行列式值的方法(DOH)。app
DoH方法就是利用圖像點二階微分Hessian矩陣, Hessian矩陣行列式的值,一樣也反映了圖像局部的結構信息。與LoG相比,DoH對圖像中的細長結構的斑點有較好的抑制做用。函數
不管是LoG仍是DoH,它們對圖像中的斑點進行檢測,其步驟均可以分爲如下兩步:性能
尺度不變特徵轉換(Scale-invariant feature transform或SIFT)是一種電腦視覺的算法用來偵測與描述影像中的局部性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變量。該描述子具備很是強的穩健性。優化
SIFT算法詳細介紹spa
SIFT算法步驟
模擬圖像數據的多尺度特徵,大尺度抓住概貌特徵,小尺度注重細節特徵。經過構建高斯金字塔(每一層用不一樣的參數$\sigma$作高斯模糊(加權)),保證圖像在任何尺度都能有對應的特徵點,即保證尺度不變性。
肯定是否爲關鍵點,須要將該點與同尺度空間不一樣$\sigma$值的圖像中的相鄰點比較,若是該點爲max或min,則爲一個特徵點。找到全部特徵點後,要去除低對比度和不穩定的邊緣效應的點,留下具備表明性的關鍵點(好比,正方形旋轉後變爲菱形,若是用邊緣作識別,4條邊就徹底不同,就會錯誤;若是用角點識別,則穩定一些)。去除這些點的好處是加強匹配的抗噪能力和穩定性。最後,對離散的點作曲線擬合,獲得精確的關鍵點的位置和尺度信息。
爲了實現旋轉不變性,須要根據檢測到的關鍵點的局部圖像結構爲特徵點賦值。具體作法是用梯度方向直方圖。在計算直方圖時,每一個加入直方圖的採樣點都使用圓形高斯函數進行加權處理,也就是進行高斯平滑。這主要是由於SIFT算法只考慮了尺度和旋轉不變形,沒有考慮仿射不變性。經過高斯平滑,可使關鍵點附近的梯度幅值有較大權重,從而部分彌補沒考慮仿射不變形產生的特徵點不穩定。注意,一個關鍵點可能具備多個關鍵方向,這有利於加強圖像匹配的魯棒性。
關鍵點描述子不但包括關鍵點,還包括關鍵點周圍對其有貢獻的像素點。這樣可以使關鍵點有更多的不變特性,提升目標匹配效率。在描述子採樣區域時,須要考慮旋轉後進行雙線性插值,防止因旋轉圖像出現白點。同時,爲了保證旋轉不變性,要以特徵點爲中心,在附近領域內旋轉$\theta$角,而後計算採樣區域的梯度直方圖,造成n維SIFT特徵矢量(如128-SIFT)。最後,爲了去除光照變化的影響,須要對特徵矢量進行歸一化處理。
SIFT特徵提取的優勢
SIFT特徵提取的缺點
SIFT特徵提取能夠解決的問題
目標的自身狀態、場景所處的環境和成像器材的成像特性等因素影響圖像配準/目標識別跟蹤的性能。而SIFT算法在必定程度上可解決:
角點檢測的方法也是極多的,其中具備表明性的算法是Harris算法與FAST算法。 算法原理詳解:Harris特徵點檢測,FAST特徵檢測
Harris角點檢測是一種基於圖像灰度的一階導數矩陣檢測方法。檢測器的主要思想是局部自類似性/自相關性,即在某個局部窗口內圖像塊與在各個方向微小移動後的窗口內圖像塊的類似性。該算法認爲像素周圍顯示存在多餘一個方向的邊,便認爲該點爲興趣點,即稱爲角點。
Harris算法步驟
提升闕值,則提取的角點數目變少,下降闕值,則提取的角點數目變多
另外求局部極大值的領域大小也會影響提取角點的數目和容忍度
Harris角點性質
這是由於在進行Harris角點檢測時,使用了微分算子對圖像進行微分運算,而微分運算對圖像密度的拉昇或收縮和對亮度的擡高或降低不敏感。換言之,對亮度和對比度的仿射變換並不改變Harris響應的極值點出現的位置,可是,因爲閾值的選擇,可能會影響角點檢測的數量。
Harris角點檢測算子使用的是角點附近的區域灰度二階矩矩陣。而二階矩矩陣能夠表示成一個橢圓,橢圓的長短軸正是二階矩矩陣特徵值平方根的倒數。當特徵橢圓轉動時,特徵值並不發生變化,因此判斷角點響應值也不發生變化,由此說明Harris角點檢測算子具備旋轉不變性。
Harris算法實現
import numpy as np import matplotlib.pyplot as plt from PIL import Image from scipy.ndimage import filters class Harris: def __init__(self, img_path): self.img_path = img_path self.grayImg = None self.Ix = None self.Iy = None self.Ix_mul_Ix = None self.Ix_mul_Iy = None self.Iy_mul_Iy = None self.cim = None self.filtered_coords = None def _rgb2gray(self): self.grayImg = Image.open(self.img_path).convert('L') self.grayImg = np.array(self.grayImg) def _cal_ix_iy(self, sigma=3): # 計算導數 self.Ix = np.zeros(self.grayImg.shape) filters.gaussian_filter(self.grayImg, (sigma, sigma), (0, 1), self.Ix) self.Iy = np.zeros(self.grayImg.shape) filters.gaussian_filter(self.grayImg, (sigma, sigma), (1, 0), self.Iy) def _cal_para(self): # 計算Ix^2,Iy^2和Ix*Iy並加入高斯濾波 self.Ix_mul_Ix = filters.gaussian_filter(self.Ix*self.Ix, 3) self.Iy_mul_Iy = filters.gaussian_filter(self.Iy*self.Iy, 3) self.Ix_mul_Iy = filters.gaussian_filter(self.Ix*self.Iy, 3) def _cal_cim(self): self.cim = (self.Ix_mul_Ix*self.Iy_mul_Iy - 2*self.Ix_mul_Iy) / (self.Ix_mul_Ix + self.Iy_mul_Iy) def cal_harris(self, min_dist=10, threshold=0.1): self._rgb2gray() self._cal_ix_iy() self._cal_para() self._cal_cim() conner_threshold = self.cim.max()*threshold self.cim = (self.cim > conner_threshold) * 1 coords = np.array(self.cim.nonzero()).T candidate_values = [self.cim[c[0], c[1]] for c in coords] index = np.argsort(candidate_values) allowed_locations = np.zeros(self.cim.shape) allowed_locations[min_dist:-min_dist, min_dist:-min_dist] = 1 self.filtered_coords = [] for i in index: if allowed_locations[coords[i, 0], coords[i, 1]] == 1: self.filtered_coords.append(coords[i]) allowed_locations[(coords[i, 0] - min_dist):(coords[i, 0] + min_dist), (coords[i, 1] - min_dist):(coords[i, 1] + min_dist)] = 0 # 此處保證min_dist*min_dist只有一個harris特徵點 return self.filtered_coords def plot_harris_point(self): plt.figure() plt.gray() plt.imshow(Image.open(self.img_path).convert('L')) plt.plot([p[1] for p in self.filtered_coords], [p[0] for p in self.filtered_coords], '*') plt.axis('off') plt.show() if __name__ == '__main__': img_path = "./imgs/3.jpg" harris = Harris(img_path) harris.cal_harris() harris.plot_harris_point()
結果演示
python計算機視覺編程第2章
圖像處理之特徵提取
python計算機視覺編程之局部圖像描述子 圖像局部特徵點檢測算法綜述 斑點檢測 SIFT定位算法關鍵步驟的說明 SIFT算法詳解 sift特徵提取算法 Harris特徵點檢測
FAST特徵檢測 特徵點提取之Harris角點提取法 Harris角點檢測(一)
原文出處:https://www.cnblogs.com/zhhfan/p/11603669.html