1. 程式人生 > >基於顏色特徵提取

基於顏色特徵提取

顏色特徵提取

顏色直方圖是最常用的一種特徵:


顏色直方圖是在許多影象檢索系統中被廣泛採用的顏色特徵。它所描述的是不同色彩在整幅影象中所佔的比例,而並不關心每種色彩所處的空間位置,即無法描述影象中的物件或物體。顏色直方圖特別適於描述那些難以進行自動分割的影象。

當然,顏色直方圖可以是基於不同的顏色空間和座標系。最常用的顏色空間是RGB顏色空間,原因在於大部分的數字影象都是用這種顏色空間表達的。然而,RGB空間結構並不符合人們對顏色相似性的主觀判斷。因此,有人提出了基於HSV空間、Luv空間和Lab空間的顏色直方圖,因為它們更接近於人們對顏色的主觀認識。其中HSV空間是直方圖最常用的顏色空間。它的三個分量分別代表色彩(Hue)、飽和度(Saturation)和值(Value)。


計算顏色直方圖需要將顏色空間劃分成若干個小的顏色區間,每個小區間成為直方圖的一個bin。這個過程稱為顏色量化(color quantization)。然後,通過計算顏色落在每個小區間內的畫素數量可以得到顏色直方圖。顏色量化有許多方法,例如向量量化、聚類方法或者神經網路方法。最為常用的做法是將顏色空間的各個分量(維度)均勻地進行劃分。相比之下,聚類演算法則會考慮到影象顏色特徵在整個空間中的分佈情況,從而避免出現某些bin中的畫素數量非常稀疏的情況,使量化更為有效。另外,如果影象是RGB格式而直方圖是HSV空間中的,我們可以預先建立從量化的RGB空間到量化的HSV空間之間的查詢表(look-up table),從而加快直方圖的計算過程。


上述的顏色量化方法會產生一定的問題。設想兩幅影象的顏色直方圖幾乎相同,只是互相錯開了一個bin,這時如果我們採用L1距離或者尤拉距離(見3.1.1節)計算兩者的相似度,會得到很小的相似度值。為了克服這個缺陷,需要考慮到相似但不相同的顏色之間的相似度。一種方法是採用二次式距離。另一種方法是對顏色直方圖事先進行平滑過濾,即每個bin中的畫素對於相鄰的幾個bin也有貢獻。這樣,相似但不相同顏色之間的相似度對直方圖的相似度也有所貢獻。

選擇合適的顏色小區間(即直方圖的bin)數目和顏色量化方法與具體應用的效能和效率要求有關。一般來說,顏色小區間的數目越多,直方圖對顏色的分辨能力就越強。然而,bin的數目很大的顏色直方圖不但會增加計算負擔,也不利於在大型影象庫中建立索引。而且對於某些應用來說,使用非常精細的顏色空間劃分方法不一定能夠提高檢索效果,特別是對於不能容忍對相關影象錯漏的那些應用。另一種有效減少直方圖bin的數目的辦法是隻選用那些數值最大(即畫素數目最多)的bin來構造影象特徵,因為這些表示主要顏色的bin能夠表達影象中大部分畫素的顏色。實驗證明這種方法並不會降低顏色直方圖的檢索效果。事實上,由於忽略了那些數值較小的bin,顏色直方圖對噪聲的敏感程度降低了,有時會使檢索效果更好


HSV空間是比較常用的統計顏色特徵的空間,它比RGB系統更接近人們的經驗隊彩色的感知。

hsv空間圖如下:


其中H代表了色調,S代表顏色,V可以看做飽和度,統計中採用了固定h和s,統計v特徵,比如,劃分h為16份,s為4份,v為4份,那麼我們最終會得到一個256維的特徵向量。具體的維數可以相應的調整,我們也可以分塊對影象進行統計。顯示更多的細節。

matlab程式碼如下:

  1. function colorhist = colorhist(rgb)   
  2. if size(rgb,3)~=3   
  3.     error('3 components is needed for histogram');   
  4. end   
  5. % globals   
  6. H_BITS = 4S_BITS = 2V_BITS = 2;   
  7. %rgb2hsv可用rgb2hsi代替,見你以前的提問。  
  8. hsv = uint8(255*rgb2hsv(rgb));   
  9. imgsize = size(hsv);   
  10. % get rid of irrelevant boundaries   
  11. i0=round(0.05*imgsize(1));  i1=round(0.95*imgsize(1));   
  12. j0=round(0.05*imgsize(2));  j1=round(0.95*imgsize(2));   
  13. hsv = hsv(i0:i1, j0:j1, :);   
  14. % histogram   
  15. for i = 1 : 2^H_BITS   
  16.     for j = 1 : 2^S_BITS   
  17.         for k = 1 : 2^V_BITS   
  18.             colorhist(i,j,k) = sum(sum(bitshift(hsv(:,:,1),-(8-H_BITS))==i-1 & bitshift(hsv(:,:,2),-(8-S_BITS))==j-1 & bitshift(hsv(:,:,3),-(8-V_BITS))==k-1 ));               
  19.         end           
  20.     end   
  21. end   
  22. colorhist = reshape(colorhist, 1, 2^(H_BITS+S_BITS+V_BITS));   
  23. % normalize   
  24. colorhist = colorhist/sum(colorhist);  

說明:bitshift是對資料的位操作,其實就是乘除法,例如:bitshift(12,-2),就是12除以2的2次方,結果為3,第二個引數是負數就是除,是整數就是乘。

reshape是吧一個矩陣變成1*M的長向量。

最後一步是歸一化的計算。