More ... | 画像比較モジュール画像比較モジュール#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,正確性)
|