想要讓計算機「看見」,就要求咱們將圖像的視覺信息轉化成計算機可以識別和處理的定量形式。這就是圖像特徵提取,傳統的特徵提取方法分爲兩個類別,分別是基於結構形態的特徵提取與基於幾何分佈的特徵提取。算法
一般狀況下,基於結構形態的特徵有兩類表示方法,一類是輪廓特徵,另外一類是區域特徵。基於結構形態的特徵提取方法主要是將字符圖像的結構形態轉化爲特徵向量,主要包括邊界特徵法、傅里葉特徵算子法、形狀不變矩法以及幾何參數法。
app
邊界特徵法ide
邊界特徵法,顧名思義,該方法主要關注的是圖像邊界部分的特徵。其中,霍夫變換法和邊界方向直方圖法是兩種最典型的邊界特徵法。函數
1. 霍夫變換spa
原始圖像座標系下的一個點對應於參數座標系中的一條直線,反之,參數座標系下的一條直線對應於原始圖像座標系下的一個點。而後,將原始圖像座標系下的各個點都投影到參數座標系以後,會發現有彙集的點,這些彙集的點組成了原始座標系下的直線。
3d
下面咱們給出一個小例子,經過霍夫變換來檢測圖片中的直線。code
原始圖片orm
具體代碼以下:blog
#coding=utf-8import cv2import numpy as npim = cv2.imread('hough.png')edges = cv2.Canny(im, 50, 150, apertureSize=3)result = im.copy()minLineLength = 10maxLineGap = 30lines = cv2.HoughLinesP(edges, 1, np.pi/180, 200, minLineLength, maxLineGap)for x1, y1, x2, y2 in lines[0]: cv2.line(result, (x1, y1), (x2, y2), (0, 0, 255), 2)cv2.imwrite("hough_result.png", result)2. 邊界方向直方圖 首先利用常見的圖像邊緣檢測算子求得圖像的邊緣,而後作出關於邊緣大小和方向的直方圖。一般的方法是構造圖像灰度梯度方向矩陣。 圖像邊緣檢測。經常使用的邊緣檢測算子有Laplacian算子、Sobel算子、Prewitt算子、Canny算子等。一幅圖像是由不少個離散的像素點組成的,上面提到的這些算子將經過差分的方式來近似偏導數的值。其中,Canny算子是效果較好的一種圖像邊緣檢測算子。它分爲兩個階段,首先對圖像進行高斯平滑,而後對平滑以後的圖像進行Roberts算子運算。
Canny邊緣檢測算子主要包括如下四個步驟。圖片
用高斯濾波器對圖像進行平滑處理。
用一階偏導的有限差分來計算梯度的幅值和方向。
對梯度的幅值進行非極大值抑制處理。
如下圖(圖左爲原圖,圖右爲灰度圖)所示,給出Canny邊緣檢測算子的代碼。
Canny算子進行圖像邊緣檢測的具體代碼:
#coding=utf-8import cv2image = cv2.imread("lena.jpg")image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#Canny邊緣檢測canny = cv2.Canny(image, 30, 150)cv2.imwrite("Canny.jpg", canny)
上述代碼輸出結果如圖所示:
傅里葉特徵算子法
傅里葉特徵算子,又稱傅里葉形狀描述子,主要做用是經過對目標邊界的輪廓進行離散傅里葉變換獲得目標邊界形狀的定量表達。
1. 離散傅里葉變換
離散傅里葉變換是圖像處理中經常使用的一種變換手段。經過離散傅里葉變換,咱們能夠將圖像的信號從時域轉換到頻域。
2. 傅里葉形狀描述子當肯定了圖像中的目標區域的起始點以及方向以後,咱們就能夠利用一系列的座標對來描述邊界的信息了。假設邊界上有個邊界點,起始點爲,按照順時針方向能夠表示爲一個座標序列:
通常來講,若是咱們將目標邊界當作是從某一個點出發,則沿着該邊界順時針旋轉一週的周邊長能夠用一個複函數來表示。換句話說就是,邊界上點的座標能夠用以下複數來表示:
代碼以下:
#coding=utf-8import cv2import numpy as np#直接讀爲灰度圖像img = cv2.imread('fuliye.png', 0)f = np.fft.fft2(img)fshift = np.fft.fftshift(f)#先取絕對值,表示取模。再取對數,將數據範圍變小magnitude_spectrum = 20*np.log(np.abs(fshift))
cv2.imwrite("original.jpg", img)cv2.imwrite("center.jpg", magnitude_spectrum)
形狀不變矩法
形狀不變矩法的主要思想是將對變換不敏感的、基於區域的幾何矩特徵做爲形狀特徵。之因此稱之爲「不變矩」,是由於矩特徵在旋轉、平移、尺度縮放的環境下都不會發生改變。
1. 矩的定義
對於二維連續函數, 階矩的定義以下:
上式中的和能夠取全部的天然數,因此上式構建了一個矩的集合,且集合與函數具備惟一性。
爲了更方便地描述物體的形狀,咱們假設函數是一個二值函數,即該函數在目標物體上的取值爲1,在背景上的取值爲0。不區分目標物體內部的灰度,參數稱爲矩的階。特別地,當時,獲得零階矩。零階矩的幾何意義是表示物體的面積,即:當時,表示物體上全部點的座標的總和;當時,表示物體上全部點的座標的總和,則一個物體的質心座標爲:
接下來,咱們給出中心矩的定義:
若是是離散函數,則中心矩的表達式爲:
在此基礎上,歸一化的中心矩的定義以下:
2. 不變矩
根據歸一化以後的中心矩,對旋轉、平移、尺度等都不敏感的七個不變矩。下面咱們對同一幅圖像,分別進行尺度縮小爲原始圖像的一半、逆時針旋轉5度操做以及垂直鏡像變換的操做,分別求出原始圖像及變換後的各個圖像的七階矩。能夠得出,這七階矩的值對於尺度、旋轉及鏡像變換不敏感。程序代碼以下:
import cv2from datetime import datetimeimport numpy as npnp.set_printoptions(suppress=True)
def my_humoments(img_gray): moments = cv2.moments(img_gray) humoments = cv2.HuMoments(moments) #取對數 humoments = np.log(np.abs(humoments)) print(humoments) if __name__ == '__main__': t1 = datetime.now() fp = 'lena.jpg' img = cv2.imread(fp) #縮放 h,w,_ = img.shape img = cv2.resize(img, (h/2, w/2), cv2.INTER_LINEAR) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imwrite("scale.jpg",img_gray) #旋轉 (h, w) = img.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, 5, 1.0) img = cv2.warpAffine(img, M, (w, h)) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imwrite("rotate.jpg", img_gray) #垂直鏡像 img = cv2.flip(img, 0, dst=None) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imwrite("flip.jpg",img_gray) my_humoments(img_gray)
原始圖像(圖左爲原圖,圖右爲其灰度圖):
程序運行後結果以下:
幾何參數法
幾何參數法主要包括像素與鄰域、位置、方向、距離、區域周長和區域面積。
1. 像素與鄰域
一幅圖像中,位於座標處的像素有4個相鄰的像素,分別位於其上下左右,座標分別爲,以下圖所示。
有時咱們不只須要某個像素點周圍4個像素的值,並且須要其周圍8個像素的值,此時8個點的座標分別爲、、、、、、、,以下圖所示。
2. 位置
目標在圖片中的位置有兩種表達方式,一種叫質心即目標質量的中心,另外一種叫形心即目標形狀的中心。對於一個大小的目標,假設其灰度值大小爲,則質心公式以下:
形心公式以下:
3. 方向
像圓形這樣的圖形,很難定義它的方向。通常地,咱們在定義方向的時候,爲了保證惟一性,事先假定物體的形狀是長方形,它的長邊即物體的方向。
4. 距離
在圖像處理領域,經常使用的距離公式包括歐幾里得距離、4鄰域距離以及8鄰域距離。假設兩個點的座標分別爲、,則AB兩點之間的距離公式以下:
歐幾里得距離(歐氏距離)
4鄰域距離
8鄰域距離
5. 區域周長
圖像中某個區域的周長的計算方式有三種,具體以下:
區域的周長能夠用區域邊界所佔的面積表示,能夠認爲是邊界的像素點數量。
若是將像素當作是一個個單獨的點,那麼區域的周長就能夠認爲是區域的邊界8鏈碼的長度。
若是將像素當作是圖像中一個個單位面積的小方格,那麼可認爲區域和背景都是由方格組成的。區域的周長就能夠定義爲區域和背景的交界線的長度。
6. 區域面積
對於二值圖來講,區域的面積能夠簡單地定義爲目標物所佔像素點的數量,即區域的邊界內包含的像素點的個數。區域面積的計算公式以下:
基於幾何分佈的特徵提取方法大體能夠分爲兩類,一類是二維直方圖投影法,另外一類區域網格統計法。
二維直方圖投影法
幾何分佈特徵提取方法的表明之一就是二維直方圖投影法,也就是獲取水平以及豎直方向上各行、列黑色像素累計分佈的結果,以下圖所示。
因爲圖片通過歸一化後,長寬相對固定,例如32×36像素的二值字符「3」以下圖左所示。通常二維直方圖投影法對圖像的掃描順序爲從上到下、從左往右,因此獲得的對應數字矩陣以下圖右所示。
在水平方向和豎直方向分別對原圖進行投影,而後分別按照行列方向統計黑色像素的值且進行歸一化,最終獲得特徵向量。以圖3-24a的二值字符「3」爲例,能夠獲得68維的特徵向量值,以下表所示。
區域網格統計法區域網格統計法是另外一種常見的基於幾何分佈的特徵提取方法。其主要思想是先利用一個的網格將原圖進行分割,而後按從上至下、從左至右的順序依次統計每個網格中「1」的個數,從而獲得最終的特徵向量。以上面的二值字符「3」爲例,咱們用一個3×4的網格對其進行分割,獲得的結果以下圖所示。
最終獲得的96維特徵向量以下表所示。