- PR -

画像の比較

投稿者投稿内容
☆VB初心者☆
会議室デビュー日: 2005/10/19
投稿数: 8
投稿日時: 2005-11-30 17:25
2枚の画像があって,お互いがどれだけ類似しているかというプログラムを作成しているのですが,上手く正答率が出てくれません。
Dim X, Y As Long
Dim i, j, k, l, stepsize As Long
Dim col1, col2 As Long
stepsize = 1
k = 0
l = 0
X = 0
For j = 0 To ny Step stepsize
For i = 0 To nx Step stepsize
k = i
l = j
col1 = Picture1.Point(i, j) ←1枚目の画像(bmp)
col2 = Picture3.Point(k, l) ←2枚目の画像(bmp)
If col1 = col2 Then
X = X + 1
End If
Next i
Next j
Y = X / 76800 * 100 ←正答率(320*240の画像なのでこのような式)
Label1.Caption = Y
というプログラムを作成してみたのですが,0%になってしまいました。
本当に初歩的なことを聞いているとは思うのですが,ご教授頂ければ幸いです。
宜しくお願い致します。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-11-30 17:54
これ何のソース?
言語は。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-30 18:19
引用:

お互いがどれだけ類似しているかという


これの定義が曖昧で、何をされているのかが判りません...

Label1.Caption とありますので、言語はおそらく VB6 以前だと思いますが、
バリアント型を使っているという意識はあるのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Elle
常連さん
会議室デビュー日: 2004/09/29
投稿数: 23
投稿日時: 2005-11-30 18:23
引用:

☆VB初心者☆さんの書き込み (2005-11-30 17:25) より:
Y = X / 76800 * 100 ←正答率(320*240の画像なのでこのような式)


XがLong、つまり整数なので、想定される最大値の76800で割るとその時点で0になっちゃうから。
つまり、Y=1/2*2が0になっちゃうのと同じ。

オーバーフロー(Longの最大値を越えてしまう)心配がなさそうなので、
Y=X*100/76800
にすれば良いんじゃないかな。
まぁ、更に約分して
Y=X/768
とすると、オーバーフローがどうとか考えなくてもすみそうだけど。
☆VB初心者☆
会議室デビュー日: 2005/10/19
投稿数: 8
投稿日時: 2005-12-01 14:22
引用:

一郎さんの書き込み (2005-11-30 17:54) より:
これ何のソース?
言語は。


返信有難うございます。
これはVB6.0です☆
☆VB初心者☆
会議室デビュー日: 2005/10/19
投稿数: 8
投稿日時: 2005-12-01 14:32
引用:

じゃんぬねっとさんの書き込み (2005-11-30 18:19) より:
これの定義が曖昧で、何をされているのかが判りません...

Label1.Caption とありますので、言語はおそらく VB6 以前だと思いますが、
バリアント型を使っているという意識はあるのでしょうか?



返信有難うございます。
変数は全て型宣言したと思ったんですが,バリアント型になっていたんでしょうか?ちょっと変更してみます。

定義は,2枚の画像(2値化されているので白or黒のみ)を比較するんですけど,比較の仕方はそれぞれの画像の同じ座標位置の画素を一つ一つ比較していって,同じならフラグを立てる。そして,最終的にはそのフラグの数を利用してどれだけ類似しているかを計算で出したいのですが,,,
この説明で理解出来ますでしょうか?文章書くのが下手ですみません。
☆VB初心者☆
会議室デビュー日: 2005/10/19
投稿数: 8
投稿日時: 2005-12-01 14:34
引用:

Elleさんの書き込み (2005-11-30 18:23) より:
XがLong、つまり整数なので、想定される最大値の76800で割るとその時点で0になっちゃうから。
つまり、Y=1/2*2が0になっちゃうのと同じ。

オーバーフロー(Longの最大値を越えてしまう)心配がなさそうなので、
Y=X*100/76800
にすれば良いんじゃないかな。
まぁ、更に約分して
Y=X/768
とすると、オーバーフローがどうとか考えなくてもすみそうだけど。


ご教授有難うございます。早速試してみたところ0ではなくなりました。しかしまだプログラム的に違うところがあるようなので頑張ってみたいと思います。
ミソジマエ
常連さん
会議室デビュー日: 2005/09/25
投稿数: 43
投稿日時: 2005-12-01 14:57
PictureBoxコントロールのPointメソッドを使用しているのであれば、
MSDNライブラリを見ると画像の1ドット当りのRGB値を返しているわけ
ではないようですね。
Pointメソッドの使用例からするとコントロールのWidth、Heightを
使用すればできそうですね。

スキルアップ/キャリアアップ(JOB@IT)