最近在研究颜色直方图匹配算法,提取一张图的色彩特征有很多种方法,最常用的一种特征是提取它的颜色直方图分布特征。网上搜了很多文章,颜色直方图匹配算法主要有两类,一类基于RGB色彩空间的直方图匹配,另一类是基于HSV色彩空间的直方图匹配。其中基于RGB色彩空间的直方图匹配,网上大多是将图像分成RGB三通道,计算每一个通道的直方图,然后求平均,最后计算相似度;我觉得这种方法会丢失很多颜色特征,很不靠谱,还不如直接转成灰度图像,求灰度直方图并计算相似度。在维基百科上看到一种基于区间统计的颜色直方图方法,感觉比较靠谱,它是将R,G,B各分量的颜色信息划分为N 区间。比如;将图像每个像素的R、G和B的值都分成4个bins(256除以64),构建RGB(4X4X4 )颜色模型,然后再统计各个区间内的像素数,如下图:
C/C++代码实现方法如下:
统计颜色直方图方法一:采用三维数组a[][][]来遍历Mat每一个像素。
vector<float> getHist1(Mat testImg)//RGB色彩空间的(4,4,4)模型。
{
const int div = 64;
const int bin_num = 256 / div;
int length = bin_num*bin_num*bin_num;
Vec3i pix;
vector<float> b;
float a[bin_num*bin_num*bin_num] = { 0 };
float d[bin_num][bin_num][bin_num] = { 0 };
for (int r = 0; r < testImg.rows; r++)
{
for (int c = 0; c < testImg.cols; c++)
{
pix = testImg.at<Vec3b>(r, c);
pix.val[0