テンプレートマッチングするには?

解決


ケイ  2006-01-09 10:33:28  No: 93483

初めて投稿させていただきます。
テンプレートマッチングをするプログラムを作っていて行き詰ってしまいました。
以下のように構成しています。
  ●画像をそれぞれ配列化(グレースケール画像を使用)
    テンプレート画像t(tx,ty) サイズ:160*120
    元画像p1(px,py)  サイズ:640*480
  ●平均(正規化)
    各画像の画素全体を足して平均を出す。
  ●分散(正規化)
    平均化された画素から分散を求める
ここからが行き詰っているのですが640*480の画像同士であれば簡単にマッチングを行えました。
しかしブロック単位となると少しプログラムをどう記述すべきか悩んでおります。
    For iy = 0 To 480
        For ix = 0 To 640
                    //mf,mgは平均, bf,bgは分散値, t1はマッチング値
                    t1 = (Abs((t(ix, iy) - mf) / Sqr(bf0)) - Abs((p1(ix, iy) - mg) / Sqr(bg0))) ^ 2
                    Debug.Print ix & "," & iy & "," & t1
                    DoEvents
        Next ix
    Next iy

全体探索では以上のようになったのですが、ブロック探査はどういったようにしたらよいでしょうか。どなたかご教授のほうお願いいたします。


特攻隊長まるるう  2006-01-12 04:32:14  No: 93484

多分、それなりにまとめてくれたんだろうけど、専門外の
人間から見たら説明の無い変数・キーワードは全く
分からないね。特にブロック単位が何を意味するかが
分からないと回答は付かない。

結局、
    For iy = 0 To 480
        For ix = 0 To 640
            Debug.Print ix & "," & iy 
            DoEvents
        Next ix
    Next iy
で 0 To 480 と 0 To 640 を例えば
20 To 40 と 60 To 80 にしたい…みたいに聞こえたけど
…すればいいんじゃない?そのまま
[VB6.0]
    Dim ixStart As Integer
    Dim ixEnd As Integer
    Dim iyStart As Integer
    Dim iyEnd As Integer
    ixStart = 20 '好きなように計算した結果を代入
    ixEnd = 40
    iyStart = 60
    iyEnd = 80
    For iy = ixStart To ixEnd
        For ix = iyStart To iyEnd
            Debug.Print ix & "," & iy _
                & " 処理開始原点からは[" & (ix - ixStart) & "," & (iy - iyStart) & "]"
            DoEvents
        Next ix
    Next iy
それとも大きな画像のステップ数を変えるんでしょうか?
    For iy = 1 To 20 Step 5
        Debug.Print iy
    Next iy


けい  2006-01-13 10:06:23  No: 93485

すみませんでした。

ブロック単位は、160*120の画像を640*480の中で探して
行くという意味です。(やりたいことです)

具体的には、640*480の画像上から160*120の画像を1ピクセル
ずつ動かして行き、ixが640−160になったらiyに1プラスする
というのをやりたいと思っているのですが、うまく行きません。


みい  2006-01-13 20:30:40  No: 93486

For iy_l = 0 To 480-120
        For ix_l = 0 To 640-160
            'ブロック単位の比較
            For iy_s = 0 To 120
                For ix_s = 0 To 160
                    '640*480上の比較ポイントix,iy
                    ix = ix_l + ix_s
                    iy = iy_l + iy_s
                    '処理
                Next ix_s
            Next iy_s
            'ブロック単位での比較結果判断
         Next ix_l
    Next iy_l


特攻隊長まるるう  2006-01-13 22:42:05  No: 93487

実際の処理では For が4階層になってると分かりにくいし
扱いにくいから、ブロック単位の比較は関数(Function)に
したほうが良さそうね。


けい  2006-01-14 07:03:29  No: 93488

みいさん、特攻隊長まるるうさん  ありがとうございます。
Forの使い方をすこし勘違いしていたようでした。

みいさんのヒントで問題解決できました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加