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に移動しました。

Source: https://habr.com/ru/post/J55926/


All Articles