hsv

来源:互联网 发布:h3c 查看端口日志 编辑:程序博客网 时间:2024/05/19 12:12
颜色特征是在图像检索中应用最为广泛的视觉特征,主要原因在于颜色往往和图像中所包含的物体或场景十分相关。此外,与其他的视觉特征相比,颜色特征对图像本身的尺寸、方向、视角的依赖性较小,从而具有较高的鲁棒性。

面向图像检索的颜色特征的表达涉及到若干问题。首先,我们需要选择合适的颜色空间来描述颜色特征;其次,我们要采用一定的量化方法将颜色特征表达为向量的形式;最后,还要定义一种相似度(距离)标准用来衡量图像之间在颜色上的相似性。在本节中,我们将主要讨论前两个问题,并介绍颜色直方图、颜色矩、颜色集、颜色聚合向量以及颜色相关图等颜色特征的表示方法。

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节)计算两者的相似度,会得到很小的相似度值。为了克服这个缺陷,需要考虑到相似但不相同的颜色之间的相似度。一种方法是采用二次式距离[4](见3.1.3节)。另一种方法是对颜色直方图事先进行平滑过滤,即每个bin中的像素对于相邻的几个bin也有贡献。这样,相似但不相同颜色之间的相似度对直方图的相似度也有所贡献。

选择合适的颜色小区间(即直方图的bin)数目和颜色量化方法与具体应用的性能和效率要求有关。一般来说,颜色小区间的数目越多,直方图对颜色的分辨能力就越强。然而,bin的数目很大的颜色直方图不但会增加计算负担,也不利于在大型图像库中建立索引。而且对于某些应用来说,使用非常精细的颜色空间划分方法不一定能够提高检索效果,特别是对于不能容忍对相关图像错漏的那些应用。另一种有效减少直方图bin的数目的办法是只选用那些数值最大(即像素数目最多)的bin来构造图像特征,因为这些表示主要颜色的bin能够表达图像中大部分像素的颜色。实验证明这种方法并不会降低颜色直方图的检索效果。事实上,由于忽略了那些数值较小的bin,颜色直方图对噪声的敏感程度降低了,有时会使检索效果更好。两种采用主要颜色构造直方图的方法可以在文献[5,6]中找到。

Matlab实现

[plain] view plain copy
print?
  1. function colorhist = colorhist(rgb)  
  2.   
  3. if size(rgb,3) ~= 3  
  4.     error(‘3 components are needed for histogram’);  
  5. end  
  6.   
  7. % globals  
  8. H_BITS = 4; S_BITS =2; V_BITS = 2;  
  9. % rgb2hsv可用rgb2hsi代替  
  10. hsv = uint8(255*rgb2hsv(rgb));  
  11.   
  12. imgsize = size(hsv);  
  13. % get rid of irrelevant boundaries  
  14. %i0 = round(0.05*imgsize(1));  
  15. %i1 = round(0.95*imgsize(1));  
  16. %j0 = round(0.05*imgsize(2));  
  17. %j1 = round(0.95*imgsize(2));  
  18. %hsv = hsv(i0:i1, j0:j1);  
  19.   
  20. % histogram  
  21. for i = 1 : 2^H_BITS  
  22.     for j = 1 : 2^S_BITS  
  23.         for k = 1 : 2^V_BITS  
  24.             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));  
  25.         end  
  26.     end  
  27. end  
  28. colorhist = reshape(colorhist, 1, 2^(H_BITS+S_BITS+V_BITS));  
  29. %normalize  
  30. %colorhist = colorhist/sum(colorhist);  
function colorhist = colorhist(rgb)if size(rgb,3) ~= 3    error('3 components are needed for histogram');end% globalsH_BITS = 4; S_BITS =2; V_BITS = 2;% rgb2hsv可用rgb2hsi代替hsv = uint8(255*rgb2hsv(rgb));imgsize = size(hsv);% get rid of irrelevant boundaries%i0 = round(0.05*imgsize(1));%i1 = round(0.95*imgsize(1));%j0 = round(0.05*imgsize(2));%j1 = round(0.95*imgsize(2));%hsv = hsv(i0:i1, j0:j1);% histogramfor i = 1 : 2^H_BITS    for j = 1 : 2^S_BITS        for k = 1 : 2^V_BITS            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));        end    endendcolorhist = reshape(colorhist, 1, 2^(H_BITS+S_BITS+V_BITS));%normalize%colorhist = colorhist/sum(colorhist);

说明:bitshift是对数据的位操作,其实就是乘除法,例如:bitshift(12,-2),就是12除以2的2次方,结果为3,第二个参数是负数就是除,是整数就是乘。
reshape是吧一个矩阵变成1*M的长向量。
最后一步是归一化的计算。


原图



直方图



参考资料:

  1. .颜色直方图, HSV直方图, histogram bins
  2. 图像颜色特征提取
  3. 百度知道的一个答案


原创粉丝点击