OpenCVを用いたヒストグラムの比較について
現在画像の類似度を求めるために、OpenCV1.0を使って色のヒストグラムの距離を求めるということを行っております。OpenCVで公開されているヒストグラム間の距離のサンプルプログラムを使って行っているのですが、結果があまり芳しくないためいろいろ調べなおしたところ、減色処理、量子化というワードにたどり着きました。
しかし調べてみてもいまいち分からず、行き詰っているのが現状です。どなたか減色処理や量子化について詳しい人がおりましたら、是非回答のほうよろしくお願いします。以下がOpenCVのコードなのですが、どこの部分をどのように変えたらそれが実現できるのかも是非回答お願いいたします。
#include <cv.h>
#include <highgui.h>
#include <math.h>
#include <stdio.h>
int
main (int argc, char **argv)
{
char text[16];
int i, hist_size = 256, sch = 0;
float range_0[] = { 0, 256 };
float *ranges[] = { range_0 };
double tmp, dist = 0;
IplImage *src_img1 = 0, *src_img2 = 0, *dst_img1[4] = { 0, 0, 0, 0 }, *dst_img2[4] = {
0, 0, 0, 0};
CvHistogram *hist1, *hist2;
CvFont font;
CvSize text_size;
// (1)二枚の画像を読み込む.チャンネル数が等しくない場合は,終了
if (argc >= 3) {
src_img1 = cvLoadImage (argv[1], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
src_img2 = cvLoadImage (argv[2], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
}
if (src_img1 == 0 || src_img2 == 0)
return -1;
if (src_img1->nChannels != src_img2->nChannels)
return -1;
// (2)入力画像のチャンネル数分の画像領域を確保
sch = src_img1->nChannels;
for (i = 0; i < sch; i++) {
dst_img1[i] = cvCreateImage (cvSize (src_img1->width, src_img1->height), src_img1->depth, 1);
dst_img2[i] = cvCreateImage (cvSize (src_img2->width, src_img2->height), src_img2->depth, 1);
}
// (3)ヒストグラム構造体を確保
hist1 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1);
hist2 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1);
// (4)入力画像がマルチチャンネルの場合,画像をチャンネル毎に分割
if (sch == 1) {
cvCopy (src_img1, dst_img1[0], NULL);
cvCopy (src_img2, dst_img2[0], NULL);
}
else {
cvSplit (src_img1, dst_img1[0], dst_img1[1], dst_img1[2], dst_img1[3]);
cvSplit (src_img2, dst_img2[0], dst_img2[1], dst_img2[2], dst_img2[3]);
}
// (5)ヒストグラムを計算,正規化して,距離を求める
for (i = 0; i < sch; i++) {
cvCalcHist (&dst_img1[i], hist1, 0, NULL);
cvCalcHist (&dst_img2[i], hist2, 0, NULL);
cvNormalizeHis
お礼
ご返事が遅れ申し訳ないです。 チェックしてみたところ、2.0.1より 下のバージョンでした;; 別の方法でやってみたいと思います。 ご回答、ありがとうございました。