dポイントプレゼントキャンペーン実施中!

 現在画像の類似度を求めるために、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

A 回答 (2件)

量子化


JPEGの圧縮アルゴリズムなんかで出てきますよね。
そっちの分野では一般的な用語の使い方らしい。

# 私は真っ先にAD変換器が思い浮かびました
    • good
    • 0

> 減色処理、量子化というワードにたどり着きました。



どういう経緯で辿り着いたかわかりませんが。

量子化というと、通常アナログ値をデジタル値にすることで、コンピュータで扱う画像データなどは、すでに量子化されたものです。今回の質問との関係がわかりません。
あえて言えば、デジカメで撮影したものだったら、そのときの環境や、現像、保存時の設定等によって変化する、というくらいでしょうか。


減色には、主に2通りの方法があります。
1つは、各レベルを一定の割り合いをかけて(一定値で割って)色の組合せを減らすものです。
例えば、 RGB各8bit(256階調)で、それぞれを64で割れば、RGB各2bit(4階調)になります。
ヒストグラムで見ると、山の形はそのまま、区間幅が広くなり、区間数が減ったような状態になります。

もう一つは、使われている色を解析して、似た色を1つにまとめる等して目標の色数になるようにし、その色に番号を付けて、画像データには、その色の一覧表と、各座標ごとの色番号を保存するものです。
(インデックスカラーとかパレットカラーとか呼ばれます)
各色は元画像と同等の階調ですし、色を最適に選ぶと、見た目もそれほど変わりません。
そのため、ヒストグラムも、元画像とあまり変わりません。ただ、減色した分、歯脱けが多くなります。
また、比較をするなら、パレットを共通にするなどの工夫をしないと、似た画像なのに、ヒストグラムの歯抜けの部分同士が対応してしまって違う画像と判断される、ということもありえます。


今回の目的なら、前者の方法がよいでしょう。
ただ、画像を変換するのではなく、ヒストグラムの区間を調整した方が早いと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!