現在画像の類似度を求めるために、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
No.2ベストアンサー
- 回答日時:
量子化
JPEGの圧縮アルゴリズムなんかで出てきますよね。
そっちの分野では一般的な用語の使い方らしい。
# 私は真っ先にAD変換器が思い浮かびました
No.1
- 回答日時:
> 減色処理、量子化というワードにたどり着きました。
どういう経緯で辿り着いたかわかりませんが。
量子化というと、通常アナログ値をデジタル値にすることで、コンピュータで扱う画像データなどは、すでに量子化されたものです。今回の質問との関係がわかりません。
あえて言えば、デジカメで撮影したものだったら、そのときの環境や、現像、保存時の設定等によって変化する、というくらいでしょうか。
減色には、主に2通りの方法があります。
1つは、各レベルを一定の割り合いをかけて(一定値で割って)色の組合せを減らすものです。
例えば、 RGB各8bit(256階調)で、それぞれを64で割れば、RGB各2bit(4階調)になります。
ヒストグラムで見ると、山の形はそのまま、区間幅が広くなり、区間数が減ったような状態になります。
もう一つは、使われている色を解析して、似た色を1つにまとめる等して目標の色数になるようにし、その色に番号を付けて、画像データには、その色の一覧表と、各座標ごとの色番号を保存するものです。
(インデックスカラーとかパレットカラーとか呼ばれます)
各色は元画像と同等の階調ですし、色を最適に選ぶと、見た目もそれほど変わりません。
そのため、ヒストグラムも、元画像とあまり変わりません。ただ、減色した分、歯脱けが多くなります。
また、比較をするなら、パレットを共通にするなどの工夫をしないと、似た画像なのに、ヒストグラムの歯抜けの部分同士が対応してしまって違う画像と判断される、ということもありえます。
今回の目的なら、前者の方法がよいでしょう。
ただ、画像を変換するのではなく、ヒストグラムの区間を調整した方が早いと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 経済学 資本移動や価格変動のない次のような固定為替レート・モデルを考える。 C = 10 + 0.8 Y I 3 2022/06/21 20:50
- Excel(エクセル) セル内の一部に別セルを差し込む 3 2022/09/18 04:39
- 工学 制御工学の問題について 1 2022/10/22 17:42
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- 工学 制御工学の問題について 1 2022/10/22 11:06
- 工学 制御工学の問題について 1 2022/10/22 17:44
- 英語 Im so happy really with all my hearth for yours wo 3 2022/06/12 21:49
- 英語 意味を教えてください 1 2022/08/18 21:29
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- 数学 (4)のim(T)をu1,u2,u3の線型結合で表せ、という問題がわからないです。回答を見ると私の解 2 2023/05/31 22:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ロールオーバーを立てに並べる...
-
Excel VBA マクロ 画像(...
-
画面が真っ白になるのはどうして?
-
OpenCVを用いたヒストグラムの...
-
c++std::string型をTCHARに変換...
-
「戻る」「進む」ボタンで画像...
-
JSPでの画像ファイル表示
-
日替わりで画像を変更したい
-
MAX関数を使ってからLEFT JOIN...
-
jqueryのsortableで一部ソート...
-
createElementで作成した要素を...
-
変数内容をHTML内で表示する方法
-
指定したパスが現URLに含まれて...
-
読み込んだQRコードをフォーム...
-
CSS <div>の入れ子が反映さ...
-
JavaScriptで変更した属性の元...
-
Colorboxがうまく設置できません
-
qtipの使い方について
-
css固定したフッターが本文と重...
-
jQuery FlexSliderのカルーセ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPでの画像ファイル表示
-
画面が真っ白になるのはどうして?
-
c++std::string型をTCHARに変換...
-
フォームに入力された値により...
-
javascriptの sx, sy, sw, sh, ...
-
日替わりで画像を変更したい
-
画像ファイルの合成
-
OpenCVを用いたヒストグラムの...
-
Excel VBA マクロ 画像(...
-
ランダムに画像を表示し、ポッ...
-
クリックして変更した画像を他...
-
C言語のポインタ表現
-
「戻る」「進む」ボタンで画像...
-
1つの画像クリックで切替の方法
-
クリックすると小さい画像がキ...
-
ロールオーバーとOnclickで
-
サムネイル画像をマウスオーバ...
-
JavaScriptでボタンをクリック...
-
CGI 16進数をバイナリ-に変換
-
Javascriptで画像を水面のよう...
おすすめ情報