影象特徵提取(顏色,紋理,形狀)
1.顏色特徵提取
計算機視覺的特徵提取演算法研究至關重要。在一些演算法中,一個高複雜度特徵的提取可能能夠解決問題(進行目標檢測等目的),但這將以處理更多資料,需要更高的處理效果為代價。而顏色特徵無需進行大量計算。只需將數字影象中的畫素值進行相應轉換,表現為數值即可。因此顏色特徵以其低複雜度成為了一個較好的特徵。
在影象處理中,我們可以將一個具體的畫素點所呈現的顏色分多種方法分析,並提取出其顏色特徵分量。比如通過手工標記區域提取一個特定區域(region)的顏色特徵,用該區域在一個顏色空間三個分量各自的平均值表示,或者可以建立三個顏色直方圖等方法。下面我們介紹一下顏色直方圖和顏色矩的概念。
(1)顏色直方圖:
顏色直方圖用以反映影象顏色的組成分佈,即各種顏色出現的概率。Swain和Ballard最先提出了應用顏色直方圖進行影象特徵提取的方法[40],首先利用顏色空間三個分量的剝離得到顏色直方圖,之後通過觀察實驗資料發現將影象進行旋轉變換、縮放變換、模糊變換後圖像的顏色直方圖改變不大,即影象直方圖對影象的物理變換是不敏感的。因此常提取顏色特徵並用顏色直方圖應用於衡量和比較兩幅影象的全域性差。另外,如果影象可以分為多個區域,並且前景與背景顏色分佈具有明顯差異,則顏色直方圖呈現雙峰形。
顏色直方圖也有其缺點:由於顏色直方圖是全域性顏色統計的結果,因此丟失了畫素點間的位置特徵。可能有幾幅影象具有相同或相近的顏色直方圖,但其影象畫素位置分佈完全不同。因此,影象與顏色直方圖得多對一關係使得顏色直方圖在識別前景物體上不能獲得很好的效果。
考慮到顏色直方圖的以上問題,主色調直方圖便產生了。所謂主色調直方圖基於假設少數幾個畫素的值能夠表示影象中的絕大部分畫素,即出現頻率最高的幾個畫素被選為主色,僅用主色構成的主色調直方圖描述一幅影象。這樣的描述子並不會降低通過顏色特徵進行匹配的效果,因為從某種角度將,頻度出現很小的畫素點可以被視為噪聲。
(2)顏色矩:
顏色矩是一種有效的顏色特徵,由Stricker和Orengo提出[41],該方法利用線性代數中矩的概念,將影象中的顏色分佈用其矩表示。利用顏色一階矩(平均值Average)、顏色二階矩(方差Variance)和顏色三階矩(偏斜度Skewness)來描述顏色分佈。與顏色直方圖不同,利用顏色矩進行影象描述無需量化影象特徵。由於每個畫素具有顏色空間的三個顏色通道,因此影象的顏色矩有9個分量來描述。由於顏色矩的維度較少,因此常將顏色矩與其他影象特徵綜合使用。
(3)顏色集:
以上兩種方法通常用於兩幅影象間全域性或region之間的顏色比較、匹配等,而顏色集的方法致力於實現基於顏色實現對大規模影象的檢索。顏色集的方法由Smith和Chang提出[42],該方法將顏色轉化到HSV顏色空間後,將影象根據其顏色資訊進行影象分割成若干region,並將顏色分為多個bin,每個region進行顏色空間量化建立顏色索引,進而建立二進位制影象顏色索引表。為加快查詢速度,還可以構造二分查詢樹進行特徵檢索。
2.紋理特徵提取一幅影象的紋理是在影象計算中經過量化的影象特徵。影象紋理描述影象或其中小塊區域的空間顏色分佈和光強分佈。紋理特徵的提取分為基於結構的方法和基於統計資料的方法。一個基於結構的紋理特徵提取方法是將所要檢測的紋理進行建模,在影象中搜索重複的模式。該方法對人工合成的紋理識別效果較好。但對於交通影象中的紋理識別,基於統計資料的方法效果更好。
(1)LBP特徵
LBP方法(Local binary patterns)是一個計算機視覺中用於影象特徵分類的一個方法。LBP方法在1994年首先由T. Ojala, M.Pietikäinen, 和 D. Harwood 提出[43][44],用於紋理特徵提取。後來LBP方法與HOG特徵分類器聯合使用,改善了一些資料集[45]上的檢測效果。
對LBP特徵向量進行提取的步驟如下:
首先將檢測視窗劃分為16×16的小區域(cell),對於每個cell中的一個畫素,將其環形鄰域內的8個點(也可以是環形鄰域多個點,如圖 3‑4. 應用LBP演算法的三個鄰域示例所示)進行順時針或逆時針的比較,如果中心畫素值比該鄰點大,則將鄰點賦值為1,否則賦值為0,這樣每個點都會獲得一個8位二進位制數(通常轉換為十進位制數)。然後計算每個cell的直方圖,即每個數字(假定是十進位制數)出現的頻率(也就是一個關於每一個畫素點是否比鄰域內點大的一個二進位制序列進行統計),然後對該直方圖進行歸一化處理。最後將得到的每個cell的統計直方圖進行連線,就得到了整幅圖的LBP紋理特徵,然後便可利用SVM或者其他機器學習演算法進行分類了。
(2)灰度共生矩陣
灰度共生矩陣是另一種紋理特徵提取方法,首先對於一幅影象定義一個方向(orientation)和一個以pixel為單位的步長(step),灰度共生矩陣T(N×N),則定義M(i,j)為灰度級為i和j的畫素同時出現在一個點和沿所定義的方向跨度步長的點上的頻率。其中N是灰度級劃分數目。由於共生矩陣有方向和步長的組合定義,而決定頻率的一個因素是對矩陣有貢獻的畫素數目,而這個數目要比總共數目少,且隨著步長的增加而減少。因此所得到的共生矩陣是一個稀疏矩陣,所以灰度級劃分N常常減少到8級。如在水平方向上計算左右方向上畫素的共生矩陣,則為對稱共生矩陣。類似的,如果僅考慮當前畫素單方向(左或右)上的畫素,則稱為非對稱共生矩陣。
[43]T. Ojala, M. Pietikäinen, and D. Harwood (1994), "Performance evaluation of texture measures with classification based on Kullback discrimination of distributions", Proceedings
of the 12th IAPR International Conference on Pattern Recognition (ICPR 1994), vol. 1, pp. 582 - 585.
[44]T. Ojala, M. Pietikäinen, and D. Harwood (1996), "A Comparative Study of Texture Measures with Classification Based on Feature Distributions", Pattern Recognition, vol. 29, pp. 51-59.
[45]Xiaoyu Wang, Tony X. Han, Shuicheng Yan,"An HOG-LBP Human Detector with Partial Occlusion Handling", ICCV 2009
3.邊緣特徵提取
邊緣檢測是圖形影象處理、計算機視覺和機器視覺中的一個基本工具,通常用於特徵提取和特徵檢測,旨在檢測一張數字影象中有明顯變化的邊緣或者不連續的區域,在一維空間中,類似的操作被稱作步長檢測(step detection)。邊緣是一幅影象中不同屈原之間的邊界線,通常一個邊緣影象是一個二值影象。邊緣檢測的目的是捕捉亮度急劇變化的區域,而這些區域通常是我們關注的。在一幅影象中兩度不連續的區域通常是以下幾項之一:
# 影象深度不連續處
# 影象(梯度)朝向不連續處
# 影象光照(強度)不連續處
# 紋理變化處
理想情況下,對所給影象應用邊緣檢測器可以得到一系列連續的曲線,用於表示物件的邊界。因此應用邊緣檢測演算法所得到的結果將會大大減少影象資料量,從而過濾掉很多我們不需要的資訊,留下影象的重要結構,所要處理的工作即被大大簡化。然而,從普通圖片上提取的邊緣往往被影象的分割所破壞,也就是說,檢測到的曲線通常不是連續的,有一些邊緣曲線段開,就會丟失邊緣線段,而且會出現一些我們不感興趣的邊緣。這就需要邊緣檢測演算法的準確性。下面介紹兩個本文實現的邊緣檢測演算法:canny運算元和sobel運算元進行邊緣檢測。
(1)Canny運算元邊緣檢測
Canny邊緣檢測演算法基於一個多階邊緣運算元,是由John F. Canny於1986年首先提出的[46],他不但給出了邊緣檢測的方法,也提出了邊緣檢測的計算理論。
Canny邊緣檢測器使用一個基於高斯模型派生的檢測模型,因為未處理影象可能含有噪聲,所以開始在原始影象上應用一個高斯濾波器,結果是一個輕度平滑的影象,以至於不至於被單個噪聲畫素干擾全域性重要引數。
以一個5×5的高斯濾波模板為例(見公式3-7),對影象A應用高斯濾波可得B。下面對影象的光強梯度統計都基於圖B。
一幅影象中的邊緣可能在方向上各有所異,所以Canny演算法用四個濾波器分別檢測影象中的水平、垂直和對角線邊緣。邊緣檢測器(如 Roberts, Prewitt, Sobel)值返回一個水平方向分量Gx和豎直方向分量Gy,由此邊緣梯度和方向即可確定:
所有邊緣的角度都在上述選定的四個方向(0°,45°,90°,135°)周圍。下一步通過滯後性門限跟蹤邊緣線。
與小的光強梯度相比,數值較大的光強梯度更容易作為邊緣線。在大多數影象中定義一個門限值來確定光強梯度取值多少適合作為邊緣線通常是不可行的,因此Canny演算法使用滯後作用確定門限值。該方法使用兩個門限分別定義高低邊界。假設所有的邊緣應該不受噪聲影響而且是連續的曲線。因此我們設定一個高門限用於判定確定是邊緣的曲線,再由此出發,利用方向資訊跟蹤那些可追蹤的影象邊緣。當追蹤該邊緣時,應用低門限可以讓我們追蹤那些含有邊緣的區域直到找到下一個曲線的起點。
如圖 3‑5所示,(a)為原圖的灰度圖,(b)為高斯濾波平滑圖,(c)和(d)分別是手動設定的高低門限值如圖所示的canny邊緣檢測結果。根據多組影象資料測試發現,當canny高低門限值分別設定為50,150時能夠保證大部分有效資訊的保留且不會有過多冗餘資訊。因此後文中採用門限值[Thres1,Thres2]= 50,120 作為canny邊緣檢測引數。Opencv中以下程式碼實現:
cvCanny( dst,src, 50, 120, 3 );
(2)Sobel運算元邊緣檢測
和Canny運算元類似,Sobel運算元[47]也是利用梯度資訊對影象進行邊緣檢測的。對影象進行邊緣檢測時,計算每個畫素的梯度並給出不同方向從明到暗的最大變化及其變化率。這個結果顯示出圖片在該點亮度變化為“急劇”還是“平滑”,由此可以判斷該區域成為邊緣的概率。在實際操作中,這個成為邊緣的可能性(稱為magnitude)計算比計算方向更為可靠,也更為便捷。在影象中的每個畫素點,梯度向量只想亮度增長最大的方向,該梯度向量的長度對應於該方向的光強變化率。這就說明在同一畫素影象上一個區域的某點的sobel運算元是一個零向量,而且在邊緣線上的點上有一組向量值為亮度梯度。
數學上在原影象上應用3×3的掩膜計算水平和垂直兩個方向的變化梯度近似值。如果我們定義A為源影象,和分別作為一幅影象的水平近似梯度和垂直近似梯度,計算方式如下:
式3-9中,*表示二維卷積運算。這裡建立的座標系在x座標方向向右,y座標方向向下,在影象中的每個點,用式3-8描述總梯度大小及方向。用Sobel運算元進行邊緣檢測結果見圖 3‑6所示。