電子書籍の厳選無料作品が豊富!

当方C#にて画像の解析を試みておりますが、行き詰ってしまったので
ご質問させてください。

解析と言ってもそこまで大袈裟な物ではなく、画像A.bmp(640×460)と
画像Aから切り出した画像B.bmp(100×50)を用意して、画像Bは
画像Aに出現するかどうかを検索するだけのものです。
(上記の場合、確実に画像Aに画像Bは出現します)

色々調べてみたところ、画像をハッシュに変換して、ハッシュ値から
調べる様な物を見つけたのですが、画像A・画像BをMD5にて16桁の
ハッシュ値を算出してからの検索方法がわかりません。

そもそも、この方法が正しいのかも??
どなたかご存知の方いましたらご教授くださいませ。

よろしくお願いいたします。

A 回答 (1件)

 こんばんは。



 出来ますが、色彩を集める際にGetPixel()を使用すると重たくなりすぎますので、以下のクラスを使用する必要があります。
 http://msdn.microsoft.com/ja-jp/library/system.d …

 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;

}

}
}
    • good
    • 0
この回答へのお礼

machongola 様

直接コードまでいただき大変おどろいております。
ちょっと難しい印象を受けましたが、一つ一つ噛み砕いて
理解していきたいと思っております。

大変、参考になる資料ありがとうございました。

お礼日時:2010/02/10 11:07

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