hsv
颜色特征是在图像检索中应用最为广泛的视觉特征,主要原因在于颜色往往和图像中所包含的物体或场景十分相关。此外,与其他的视觉特征相比,颜色特征对图像本身的尺寸、方向、视角的依赖性较小,从而具有较高的鲁棒性。
面向图像检索的颜色特征的表达涉及到若干问题。首先,我们需要选择合适的颜色空间来描述颜色特征;其次,我们要采用一定的量化方法将颜色特征表达为向量的形式;最后,还要定义一种相似度(距离)标准用来衡量图像之间在颜色上的相似性。在本节中,我们将主要讨论前两个问题,并介绍颜色直方图、颜色矩、颜色集、颜色聚合向量以及颜色相关图等颜色特征的表示方法。
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?
- functioncolorhist=colorhist(rgb)
- ifsize(rgb,3)~=3
- ERROR(‘3componentsareneededforhistogram’);
- end
- %globals
- H_BITS=4;S_BITS=2;V_BITS=2;
- %rgb2hsv可用rgb2hsi代替
- hsv=uint8(255*rgb2hsv(rgb));
- imgsize=size(hsv);
- %getridofirrelevantboundaries
- %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);
- %histogram
- fori=1:2^H_BITS
- forj=1:2^S_BITS
- fork=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
- end
- end
- colorhist=reshape(colorhist,1,2^(H_BITS+S_BITS+V_BITS));
- %normalize
- %colorhist=colorhist/sum(colorhist);
function colorhist = colorhist(rgb)
if size(rgb,3) ~= 3
error('3 components are needed for histogram');
end
% globals
H_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);
% histogram
for 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
end
end
colorhist = 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的长向量。
最后一步是归一化的计算。
原图
直方图
参考资料:
- .颜色直方图, HSV直方图, histogram bins
- 图像颜色特征提取
- 百度知道的一个答案
相关阅读
OpenCV实战2——进行颜色检测(HSV颜色空间)和分割的隐
原文地址:https://www.learnopencv.com/invisibility-cloak-using-color-detection-and-segmentation-with-opencv/ 开源代码:https