颜色聚合向量Color Coherence vector CCV
InHDU-Lab_532onApril 8,2014at19:00 pm颜色特征是在图像检索中应用最为广泛的视觉特征,主要原因在于颜色往往和图像中所包含的物体或场景十分相关。此外,与其他的视觉特征相比,颜色特征对图像本身的尺寸、方向、视角的依赖性较小,从而具有较高的鲁棒性。
颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。
计算颜色直方图需要将颜色空间划分成若干个小的颜色区间,每个小区间成为直方图的一个bin。这个过程称为颜色量化(color quantization)。然后,通过计算颜色落在每个小区间内的像素数量可以得到颜色直方图。设一幅彩色图像包含N个象素,图像的颜色空间被量化为L种不同的颜色,则颜色直方图可通过下式计算:
,为整幅图像中第k种颜色的像素个数。
从上述定义可以看出,颜色直方图表现的是图像的一种全局特征,每一幅图像具有唯一的颜色直方图。并且,颜色直方图对图像的旋转、平移以及缩放具有天生不变性。但是,颜色直方图仅仅考虑了图像象素的颜色,但同时它丢失了图像颜色的空间分布信息,两幅颜色空间分布完全不同的图像可以具有相同的直方图,这样就会造成检索的误差,因此检索还应该加进颜色的空间分布信息。
针对颜色直方图和颜色矩无法表达图像色彩的空间位置的缺点,Pass提出了图像的颜色聚合向量(color coherence vector,CCV)。它是颜色直方图的一种演变,其核心思想是将属于直方图每一个bin的像素进行分为两部分:如果该bin内的某些像素所占据的连续区域的面积大于给定的阈值,则该区域内的像素作为聚合像素,否则作为非聚合像素,从而将每一个bin分文颜色聚合向量和颜色非聚合向量。假设,分别代表直方图的第i个bin中聚合像素和非聚合像素的数量,图像的颜色聚合向量可以表达为。而显然,就是该图像的颜色直方图。由于包含了颜色分布的空间信息,颜色聚合向量相比颜色直方图可以达到更好的检索效果。
颜色聚合向量算法可以通过以下几个步骤来完成对图像颜色特征的提取:
(1)量化
CCV算法的第一步与求普通的直方图类似,即量化处理。可以采用各种量化方法,但是为了减少在接下来计算连通区域过程中的复杂度,一般采用均匀量化比较好。量化的结果是使得图片中只剩下n个颜色区间,即bin。
(2)划分连通区域
对重新量化后的像素值矩阵,根据像素间的连通性把图像划分成若干个连通区域。连通区域可以看成是一个最大的像素集合,即对于一个区域C,对于任意两个像素点,且,在区域C中p和之间都存在一条通路(每一个都在C内,且与是相邻的,此处的相邻指周围的8个像素,也包括对角线在内)。
(3)判断聚合性
通过上一步,可以把一幅图像划分成多个连通区域,统计每一个独立的连通区域C中的像素数,并设定一个阈值(一般取为图像总像素的1%)作为判断某个区域C中的像素是聚合的还是非聚合的,具体的判断依据如下:
Ⅰ.如果某个区域中的像素数大于阈值,则该区域中的像素是聚合的。
Ⅱ.如果某个区域中的像素数小于阈值,则该区域中的像素是非聚合的。
对于重新量化后的每一个颜色分量,按照上述的判断依据分别统计各连通区域中颜色值为似的像素中聚合像素的总数和非聚合像素的总数。
(4)得到结果
根据上一步的统计结果,假设和分别代表重新量化后的第i个颜色分量中聚合像素和非聚合像素的总数,则称为第i个颜色分量的聚合对,则图像的颜色聚合向量即该图像的颜色特征可以表示为:
颜色聚合向量很好地解决了直方图没有考虑图像颜色空间分布信息的缺点,可以有效地减少检索的误差。在实际检索应用中,对于两幅图像和,它们的颜色聚合向量分别为和,那么和的距离或者说不同可以表示为:
但是,很明显,性能的增加是以效率为代价的,颜色聚合向量算法在直方图的基础上增加了划分连通区域和判断聚合性等步骤,大大增加了计算量。尤其是实现判断连通区域的时候需要用到迭代与回溯算法,这对于计算量是很大的考验。为了减少计算量,尽量采取均匀量化的方法,并可以适当减小量化的阶数,即的个数。另外,也可以对于很大的图像,可以先做一些“模糊化”的预处理,把某个小邻域内的值用平均值代替,这样也可以很大程度减少计算量。
Sample
function CCV_output = Color_Coherence_Vectors(img) %img is simple channel [rows,cols] = size(img); H = fspecial('average',3); imgBlur = imfilter(img,H,'replicate'); clear('img'); N = 4;%量化为N等份 % Ndis = 256/N;%量化距离 % reduceColors = ((imgBlur-Ndis/2)/Ndis)+1; imgBlur = double(imgBlur); minpix = min(min(imgBlur)); maxpix = max(max(imgBlur)); reduceColors = round((imgBlur-minpix)/(maxpix-minpix)*(N-1))+1; clear('imgBlur'); CCV_outputT = zeros(N,2); for m = 1:N lianTong = bwlabel(reduceColors == m,8); JuHe = 0; N_JuHe = 0; for m1 = 1:max(max(lianTong)) lianTongareaSimple = length(find(lianTong == m1)); if lianTongareaSimple > rows*cols*0.01 % JuHe = JuHe + lianTongareaSimple; else N_JuHe = N_JuHe + lianTongareaSimple; end end CCV_outputT(m,1) = JuHe; CCV_outputT(m,2) = N_JuHe; end % CCV_output = CCV_outputT/(rows*cols)*1.0; CCV_output = CCV_outputT;
转载请注明作者和出处:http://blog.csdn.net/erlingmusan.未经允许请勿用于商业用途