最初に、比較は非常に近似的であることに注意する価値があります(少なくともこの段階では)、2枚のまったく異なる写真が60%に近い場合があります。また、ハードな変更(回転、反転、トリミング)も考慮されません。持ってきて 私個人にとって最も重要なことは、 速度 、 画像解像度の 独立性 、およびデータベース内の「画像」を直接比較する能力という2つのパラメータでした。
原理
- オープンソース画像
- マスクのサイズに合わせてスケーリングします(私の場合は20 x 20です。大きなサイズは必要ありません-比較はおおよそであり、マスクと10 x 10を作成することはかなり可能です)。
- マスクのメインカラーを計算します。
- 値がaf2型のキーである配列を作成します(1,2-海軍の戦闘のように座標。2-メインの明るさとの不一致)。
- 行-キーを生成します。
- 関連性によって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 .
*類似度計算関数は近似値です-ベース側でこのアクションを実行することをお勧めします。
例
驚くべきことに、
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に移動しました。