http://blog.csdn.net/cxf7394373/article/details/6911255
介绍
传统的颜色直方图只刻画了某一种颜色的像素数目占像素总数目的比例,只是一种全局的统计关系,而颜色相关图则表达了颜色随距离变换的空间关系,也就是颜色相关图不仅包含图像颜色统计信息,同时包括颜色之间的空间关系。颜色相关图[3]比颜色直方图具有更高的检索效率,特别是查询空间关系一致的图像。
假设I表示整张图像的全部像素,Ic(i) 则表示颜色为c(i)的所有像素。颜色相关图可以表达为:
其中 i, j ∈ {1, 2, …, N},k∈ {1, 2, …, d},| p1 – p2 | 表示像素p1和p2之间的距离。颜色相关图可以看作是一张用颜色对<i, j>索引的表,其中<i, j>的第k个分量表示颜色为c(i)的像素和颜色为c(j)的像素之间的距离小于k的概率。如果考虑到任何颜色之间的相关性,颜色相关图会变得非常复杂和庞大 (空间复杂度为O(N2d))。一种简化的变种是颜色自动相关图(6),它仅仅考察具有相同颜色的像素间的空间关系,因此空间复杂度降到O(Nd)。下面给出了自相关图的程序。
颜色相关图的参考文献:
[1] Greg Pass, RaminZabih. Comparing images using color coherence vectors.
代码如下:
/************************************************************************/
/*
作用:计算颜色相关图
输入:img---源图像,计算的第channel通道的颜色矩
输出:浮点型数组,颜色相关图的维数为64维
返回值:
0 计算成功
1 图片为空,计算失败
2 参数指针correlogram没有分配内存
3 图片通道不是1,目前只处理单通道图片,计算失败
*/
/************************************************************************/
int calColorCorrelogram(const IplImage * img,double * correlogram)
{
if(NULL == img)
return 1;
if(NULL == correlogram)
return 2;
if(img->nChannels > 1)
return 3;
//生成一个数组,每个点的范围是0-7
int width = img->width;
int height = img->height;
int * mark = new int[width * height];
int step = img->widthStep/sizeof(uchar);
uchar * data = (uchar *)img->imageData;
for (int i = 0;i < height;++i)
for (int j = 0;j < width;++j)
mark[i * width + j] = int(8 * (data[i * width + j] + 1) * 1.0 /255);
//计算相关图 DISTANCE = 8
int grade,hist;
int sum = 0;
for (int i = 0;i < height - DISTANCE + 1;++i)
{
for (int j = 0;j < width - DISTANCE + 1;++j)
{
//获取当前点的灰度级,目前分8个等级
hist = mark[i * width + j];
for (int k = 1;k < DISTANCE;k++)
{
for (int r = 1;r < DISTANCE;r++)
{
if(mark[(i + k) * width + j + r] == hist)
{
grade = k > r ? k : r;//获取距离---水平与垂直距离中较大的
correlogram[hist * DISTANCE + grade - 1]++;
sum++;
}
}
}
}
}
if(sum <= 0)
return 1;
//计算特征向量 GRAM_SIZE = 8
for(int i = 0;i < GRAM_SIZE;i++)
correlogram[i] = correlogram[i] / sum;
delete[] mark;
}