画像検索の方法について

このQ&Aのポイント
  • C#を使用して画像の解析を試みていますが、行き詰まっています。
  • 画像をハッシュに変換して、ハッシュ値から検索する方法がわかりません。
  • どなたかご存知の方がいらっしゃいましたら、ご教授いただけませんか。
回答を見る
  • ベストアンサー

画像中の検索について教えてください

当方C#にて画像の解析を試みておりますが、行き詰ってしまったので ご質問させてください。 解析と言ってもそこまで大袈裟な物ではなく、画像A.bmp(640×460)と 画像Aから切り出した画像B.bmp(100×50)を用意して、画像Bは 画像Aに出現するかどうかを検索するだけのものです。 (上記の場合、確実に画像Aに画像Bは出現します) 色々調べてみたところ、画像をハッシュに変換して、ハッシュ値から 調べる様な物を見つけたのですが、画像A・画像BをMD5にて16桁の ハッシュ値を算出してからの検索方法がわかりません。 そもそも、この方法が正しいのかも?? どなたかご存知の方いましたらご教授くださいませ。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  出来ますが、色彩を集める際にGetPixel()を使用すると重たくなりすぎますので、以下のクラスを使用する必要があります。  http://msdn.microsoft.com/ja-jp/library/system.drawing.imaging.bitmapdata(VS.100).aspx  MD5クラスの使用法  http://dobon.net/vb/dotnet/string/md5.html  dest.bmpに640x480を、source.bmpに100x50を指定してみてください。  改善の余地もあるかとは思いますが、以下参考程度に。 private byte[] MakeMD5From(Bitmap from) { System.Drawing.Imaging.BitmapData bmData = from.LockBits(new Rectangle(0, 0, from.Width, from.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte[] images = new byte[bmData.Stride * bmData.Height]; System.Runtime.InteropServices.Marshal.Copy(bmData.Scan0, images, 0, images.Length); from.UnlockBits(bmData); System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); return md5.ComputeHash(images); } private bool CompareMD5(byte[] a, byte[] b) { for (int i = 0; i < a.Length; ++i) { if (a[i] != b[i]) return false; } return true; } private void button1_Click(object sender, EventArgs e) { Bitmap bmDest = new Bitmap("dest.bmp"); Bitmap bmSource = new Bitmap("source.bmp"); Bitmap bmWork = new Bitmap(bmSource.Width, bmSource.Height); Rectangle rc = new Rectangle(0, 0, bmSource.Width, bmSource.Height); byte[] md5src = this.MakeMD5From(bmSource); for (int y = 0; y < bmDest.Height - bmSource.Height; ++y) { for (int x = 0; x < bmDest.Width - bmSource.Width; ++x) { Graphics gfx = Graphics.FromImage(bmWork); gfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; gfx.DrawImage(bmDest, rc, new Rectangle(x, y, bmSource.Width, bmSource.Height), GraphicsUnit.Pixel); gfx.Dispose(); byte[] md5dest = this.MakeMD5From(bmWork); if (this.CompareMD5(md5dest, md5src) == false) continue; MessageBox.Show("発見", "[x = " + x.ToString() + "][y = " + y.ToString() + "]"); return; } } }

neo_ts
質問者

お礼

machongola 様 直接コードまでいただき大変おどろいております。 ちょっと難しい印象を受けましたが、一つ一つ噛み砕いて 理解していきたいと思っております。 大変、参考になる資料ありがとうございました。

関連するQ&A

  • ソフトによって画像変換後のバラつきはあるの?

    画像フォーマットを変換するたくさんのソフトがありますが、ソフトによって変換後の画像データにバラつきはあるのでしょうか? 例えばBMPからPNGに変換できるソフトAとBがあるとします。この場合ソフトAとBが変換した、変換後の画像データはソフトAとBによって違いは出てくるのでしょうか?Aの方が綺麗だとかBの方が圧縮率が高いといったことです。 お願いします。

  • bmp画像をtiff圧縮する方法

    VBAを使って、bmp画像をtiff圧縮するプログラムを教えてください。 検索すると http://okwave.jp/qa/q8508126.html 画像圧縮、変換用のライブラリ を使えば良いという回答ページは見つかったのですが 具体的な方法が分かりません。 「画像 dll vba tif bmp」などで検索してみても分かりませんでしたので 教えてください。

  • UWSCの画像認証について。

    UWSCの画像認証について。 画像は以下の4つ A.bmp B.bmp C.bmp D.bmp 画面場のどこかに A.bmp B.bmp のどちらかがある場合 クリックさせ CやDの場合は クリックしないというプログラムを組みたいのですが 初心者でわからなくなりました。 画像1つだけのは他の質問でみつけてクリックできるようになったのですが 判定させることがわかりません。 よろしくお願いします

  • Vb.net2005での画像の合成方法

    Vb.net2005での画像の合成方法がいろいろ探してみましたがよくわかりません 具体的には a.bmpとそれより小さいb.bmpを二枚の画像を1枚に合成したいのです いいお知恵をお貸しください

  • エクセルの画像リンク

    エクセルで画像データ検索機能を作成したいのですが、画像リンクで躓いております。 セル(A1)に画像の名前(001.bmp)を打つと、B1のセルなどに001.bmpの画像が表示されるようにできないでしょうか。 実際はもう少々手を加えた検索にしたい為、セルに入力した内容で反映させたいのです。 参照対象の画像は、(1)規定のフォルダにすべて保存する or (2)別のエクセルシートに名称と画像を添付したデータベースを作成する など管理できれば方法は問いません。 宜しくお願いします。

  • 重複画像検索ソフト

    フォルダAとフォルダBがあるとします AとBの両方にある画像(ファイル名は違う)を検索してくれるソフトはありませんでしょうか 普通の重複画像検索ソフトだとBの中にある二つの重複画像まで見つけてしまいそれが膨大な量なので目的のAにもBにもあるファイルが埋もれてしまいます AとBのサブフォルダまで検索できるとさらに良しです どうかよろしくお願いします

  • 画像のサイズについて

    PNGやBMP画像などで容量が知りたい場合、 プロパティを開けばわかりますが、 計算で算出する方法はございますか? 画素数*色数で分かると聞きましたが、 その方法でも、結果が食い違ってきます。

  • 短いハッシュの作り方

    特に言語には関係がないのでこのカテゴリに。 md5やsha1でハッシュを作ると、32桁か40桁で大文字小文字の区別がないものとなります。 以下のような短いハッシュはどのように作るのでしょうか。 http://am6.jp/asRleJ http://twitpic.com/12zs0a http://bit.ly/axe7hu

  • TIFF画像をBMP画像に変換

    TIFF画像をBMP画像に変換したいのですが、処理方法やソース等をご存知の方、いらっしゃいませんでしょうか? どうぞよろしくお願い致します。

  • エクセル下三桁の検索方法教えて下さい

    初めて質問させていただきます。 Sheet1 A1 に検索したい数字(3桁)入力します Sheet2 の B1 - B123 までに検索したい対象の数字(アルファベット含、10桁以上)の数値があります。 A1に数値を入力し 他のセルにB1-B123の下三桁と一致するセルを出したいのですが、 たどり着けませんでした。 分かる方、教えて下さい。 できればVBではなく、関数の方法お願いします。

専門家に質問してみよう