• 締切済み

C#における正規化について教えて下さい

現在大学でプログラミングをやっている大学4回生です。 使用言語はC#で、ライブラリ関数としてOpenCvSharpを使用しています。 今現在、類似画像検索機能を実装しようとしているのですが、なかなかうまくいきません。 特徴量は今のところカラーヒストグラムのみでやっています。 流れとしては、 入力画像を読み込み64色に減色した後、順にカラーヒストグラムを算出して要素数が64の配列に格納しています。 ちなみにint型で定義しています。 扱っている画像は900*1200ぐらいサイズから、1800*2700など大きいサイズも多く含まれています。 配列の中は単純にその色の画素数になっていますので、かなりの数になります。 また、画像のサイズの違いによってヒストグラムの合計値にも差がでてきてしまいます。 そこで、それぞれのヒストグラムに正規化を行い、0から任意に指定した最大値までの値で出力し、 比較を行えるようにしたいのですが、どのように正規化を行うのがいいのでしょうか。 正規化できた後は、正規化した2つのヒストグラムをHistogram Intersectionを用いて比較し、類似度を求めようと考えています。 Histogram Intersectionを使うためには正規化を行わないと無理があるのではと思ったので(汗)。 これが1番の理由です... C++等でのやり方はいくつか見つけたのですが、私の力ではそれをC#で使用できるように翻訳することもできなさそうなので... 手法の方はできるだけ詳しく教えていただけると幸いです。 よろしくお願いします!

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

OpenCVSharpは使ったこと無いのでわかりませんが OpenCVにはNormalizeHistやCompareHistといったヒストグラム操作用の関数が用意されています。 http://opencv.jp/opencv-1.1.0/document/opencvref_cv_histograms.html http://opencv.jp/sample/histogram.html これらはOpenCVSharpには実装されていないのですか?

yoshi_0609
質問者

お礼

NormalizeHistやCompareHistは確かにOpenCvSharpでも使用できるのですが、型がCvHistogramで宣言されており、普通のint型で定義した配列などにはこの関数が使えなかったんです... しかもサンプルプログラムも見てみたのですが、すべてグレースケールの画像に対するものばかりで、カラー画像からマルチチャンネルでヒストグラムを抽出しているようなソースがあまりありませんでした。 確かにC++などで書かれているものはありましたが、それをどうC#用に翻訳していいのかがいまいち分からなかったので別の方法は無いかと探していた所でした。 ただ、今少し解決の兆しが見え始めてきたので、もう少し自分で頑張ってみようと思います。 助言を仰いでおいて失礼なことかもしれませんが... ですが丁寧に回答して頂き、本当にありがとうございました。 また投稿するかもしれませんが、その時はまた答えていただけると嬉しいです!

回答No.1

> C++等でのやり方はいくつか見つけたのですが、私の力ではそれをC#で使用できるように翻訳することもできなさそうなので... ならばC++/CLIで実装し、C#から呼び出してはいかがでしょう。

yoshi_0609
質問者

お礼

C++やCLIが使用できるソフトは今自分のPCには入れてません... 今からそれを行って実装してみるほどの時間も取ることができなさそうなので... ただ一晩考えてプログラムの不具合を発見し、それを改善することによって解決策が 見出せそうなので、もう少し自分で頑張ってみます。 それでも無理ならまたここに書き込むかもしれません。 その時はまたコメントを頂けると幸いです。 お答え頂きありがとうございました!