[Top Page][Edit][Discussion][Edit History][All Pages][Recent Changes][->Japanese]

画像比較モジュール

画像比較モジュール

#module
//比較除外色の情報をすべてクリア
#deffunc imghclsdel
dim IMGHCOLOR,1:return

//      比較する対象から除外する色を指定
// imghclsadd R,G,B
#deffunc imghclsadd int p1, int p2, int p3
if IMGHCOLOR=0{sdim IMGHCOLOR,64,0:IMGHCOLOR.(length(IMGHCOLOR)-1)=""+p1+","+p2+","+p3
}else{:IMGHCOLOR.(length(IMGHCOLOR))=""+p1+","+p2+","+p3:}:return

/*
imgh
p1 比較元ウィンドウID

p2 比較先ウィンドウID

p3 類似率を算出するアルゴリズム。
        0で色の違いの度合いも含めて算出
        1で色が少しでも違った場合、完全に違う色として算出
        0だと類似率が高くなりがち、1だと低め。基本的に1推奨

p4 正確度。総ピクセル/p4で比較するピクセルの数を決定する為、
        値を高くすればするほど処理は早くなるが正確性は失われる。
        比較する画像・目的によっても変わるが、総px/1000.0程度の値を指定しても正確性は問題ない。


隠し機能として、比較するかしないかをRGB個別に指定可能。
下にあるAは上からR,G,Bに割り当てられていて、0で比較なし、1で比較あり。
デフォだとRGB全て比較。
*/
#defcfunc imgmc int 比較元,int 比較先,int モード,int sc2
                sc=sc2
                A.0=1
                A.1=1
                A.2=1
                操作先ウィンドウID=ginfo(3)
                        gsel 比較元
                                mref 比較元px,66
                                比較サイズx=ginfo_winx:比較サイズy=ginfo_winy
                                sc=limit(sc,1,(比較サイズx*比較サイズy)/10.0)
                                総px=double(比較サイズx*比較サイズy)/sc
                        gsel 比較先
                                mref 比較先px,66
                                if 比較サイズx!ginfo_winx or 比較サイズy!ginfo_winy:Dialog "比較元のウィンドウサイズと\n比較先のウィンドウサイズが異なります。",1,"ウィンドウサイズが異なります":return -1
                        dim 元,3,総px
                        dim 先,3,総px
                        dim 差,3
                                        類似値=double(0.0)
                                        repeat 総px
                                                        ct=cnt
                                                        repeat 3
                                                        if A.cnt=1:{
                                                                元.cnt.ct=peek (比較元px,(ct*sc)+(2-cnt))
                                                                先.cnt.ct=peek (比較先px,(ct*sc)+(2-cnt))
                                                                if (元.cnt.ct-先.cnt.ct)>=0 & モード=0:{
                                                                        差.cnt+(元.cnt.ct-先.cnt.ct)
                                                                        }else{
                                                                                差.cnt+(先.cnt.ct-元.cnt.ct)
                                                                        }
                                                                if (元.cnt.ct-先.cnt.ct)!0 & モード=1:{
                                                                        差.cnt+255
                                                                        }
                                                        }
                                                        loop
                                        loop
                                        repeat 3
                                        if A.cnt=1:類似値+(100.0-(double(差.cnt)/double(総px*2.55)))
                                        loop
                                                類似値/double(A.0+A.1+A.2)
                gsel 操作先ウィンドウid
        return 類似値
#global
Screen 0,500,500
        dialog "",16,"画像"
        if stat=1:picload refstr,1:else:Color 255,0,0:boxf 10,10,490,490

Screen 1,ginfo_winx,ginfo_winy
        dialog "",16,"画像"
        if stat=1:picload refstr,1:else:Color 150,0,0:boxf 5,5,495,495
        正確性=(ginfo_winx*ginfo_winy)/10.0
title ""+imgmc(0,1,0,正確性)