顏色相關圖的參考文獻:
[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-7int 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.0 /256); //計算相關圖 DISTANCE = 8int 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 = 64for(int i = 0;i < GRAM_SIZE;i++)correlogram[i] = correlogram[i] / sum;delete[] mark;}