基于颜色特征提取

颜色特征提取

颜色直方图是最常用的一种特征:


颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。

当然,颜色直方图可以是基于不同的颜色空间和坐标系。最常用的颜色空间是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空间图如下:

基于颜色特征提取_第1张图片

其中H代表了色调,S代表颜色,V可以看做饱和度,统计中采用了固定h和s,统计v特征,比如,划分h为16份,s为4份,v为4份,那么我们最终会得到一个256维的特征向量。具体的维数可以相应的调整,我们也可以分块对图像进行统计。显示更多的细节。

matlab代码如下:

[html] view plaincopy
  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.   
  10. imgsize = size(hsv);   
  11. % get rid of irrelevant boundaries   
  12. i0=round(0.05*imgsize(1));  i1=round(0.95*imgsize(1));   
  13. j0=round(0.05*imgsize(2));  j1=round(0.95*imgsize(2));   
  14. hsv = hsv(i0:i1, j0:j1, :);   
  15.    
  16. % histogram   
  17. for i = 1 : 2^H_BITS   
  18.     for j = 1 : 2^S_BITS   
  19.         for k = 1 : 2^V_BITS   
  20.             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 ));               
  21.         end           
  22.     end   
  23. end   
  24. colorhist = reshape(colorhist, 1, 2^(H_BITS+S_BITS+V_BITS));   
  25. % normalize   
  26. colorhist = colorhist/sum(colorhist);  

说明:bitshift是对数据的位操作,其实就是乘除法,例如:bitshift(12,-2),就是12除以2的2次方,结果为3,第二个参数是负数就是除,是整数就是乘。

reshape是吧一个矩阵变成1*M的长向量。

最后一步是归一化的计算。

你可能感兴趣的:(特征提取,matlab,matlab,数字图像处理)