PHPを使用した簡単な画像比較

アルゴリズムはおそらく新しいものではなく、理想的でもありませんが、驚くべきことに機能します。 グラフも相関もありません。



最初に、比較は非常に近似的であることに注意する価値があります(少なくともこの段階では)、2枚のまったく異なる写真が60%に近い場合があります。また、ハードな変更(回転、反転、トリミング)も考慮されません。持ってきて 私個人にとって最も重要なことは、 速度画像解像度の 独立性 およびデータベース内の「画像」を直接比較する能力という2つのパラメータでした。



原理



コード



この場合、 PNG画像でGDを介して機能するバージョンが表示されます。

// -

function getimageid($image)

{

//

$size=getimagesize($image);



//

$image=imagecreatefrompng($image);



//

$zone=imagecreate(20,20);



//

imagecopyresized($zone,$image,0,0,0,0,20,20,$size[0],$size[1]);



//

$colormap=array();



//

$average=0;



//

$result=array();



//

for ($x=0;$x<20;$x++)

for ($y=0;$y<20;$y++)

{

$color=imagecolorat($zone,$x,$y);

$color=imagecolorsforindex($zone,$color);



// Ryotsuke

$colormap[$x][$y]= 0.212671 * $color[ 'red' ] + 0.715160 * $color[ 'green' ] + 0.072169 * $color[ 'blue' ];



$average += $colormap[$x][$y];

}



//

$average /= 400;



//

for ($x=0;$x<20;$x++)

for ($y=0;$y<20;$y++)

$result[]=($x<10?$x:chr($x+97)).($y<10?$y:chr($y+97)).round(2*$colormap[$x][$y]/$average);



//

return join( ' ' ,$result);

}




* This source code was highlighted with Source Code Highlighter .






// ""

function imagediff($image,$desc)

{

$image=explode( ' ' ,$image);

$desc=explode( ' ' ,$desc);



$result=0;



foreach ($image as $bit)

if (in_array($bit,$desc))

$result++;



return $result/((count($image)+count($desc))/2);

}




* This source code was highlighted with Source Code Highlighter .






*類似度計算関数は近似値です-ベース側でこのアクションを実行することをお勧めします。





画像

驚くべきことに、 95% 87%の類似性 (UPD-2を追加)



画像

52%の類似性



画像

28%の類似性



画像

100%の類似性



追記



これはすべて近似計算にすぎず、この方法で特に高度な比較を行うことはできませんが、同様の画像のデータベースからすばやく選択することができます。



PSコメントとアドバイスが受け入れられます。

UPDありがとうMiniM-コードが簡素化されました。

UPD-2小規模追加:

//

for ($x=0;$x<20;$x++)

for ($y=0;$y<20;$y++)

$result[]=($x<10?$x:chr($x+97)).($y<10?$y:chr($y+97)).($colormap[$x][$y]==0? '0' :round(2*($colormap[$x][$y]>$average?$colormap[$x][$y]/$average:-1*$average/$colormap[$x][$y])));



* This source code was highlighted with Source Code Highlighter .






その後、その時点での輝度の低下が考慮されます。 したがって、最初の例の類似度は87%になります。

UPD-3をphpに移動しました。



All Articles