2011-01-05 16 views
3

私は、モバイル、PC、PSPなどのあらゆるデバイスに適した、さまざまな解像度で同じ画像の多くのファイルを持っています。今、私はページ内のユニークな画像だけを表示しようとしています。私は最初にデータベースを管理していればこれを避けることができたかもしれませんが、私はしませんでした。そして私はあなたの助けが最大のユニークな写真を検出する必要があります。PHPで類似の画像を検出するには?

+2

名にさえ類似性がありませんか?さもなければ、N:M比較状況で、おそらくそれがあなたを助けることができる(あなたがトリックを行うアルゴリズムを見つけるならば)終わるだろう。http://stackoverflow.com/questions/2037205/image-comparison-with-php-gdしかし、覚えておいてください。最初の場所にいなかった場合は、データベースの維持を開始する画像が1000個ある場合は、999999の比較操作 – Hannes

+2

を開始してください。あなたが過去に間違いを犯してしまったとしても、間違いを回避するためにコード/ –

+2

うわー、これはCPUサイクルの点で非常に高価になるでしょう。最初に使用したのと同じアルゴリズムを使用して、すべての画像Aを縮小する必要があります(Aは、2つの画像のうち大きい方の画像です)。縮小されたAとBが同等であれば、その情報を何らかの形で保存し、次のペアを続行します。これはO(N²)である可能性があるので、大量のデータを扱う場合は2度考えるべきです。私はあなたのデータベースを修正する必要がありますと思います。どんなものでも。 – jwueller

答えて

2

まあ、でもあなた、私はまだ手動でそれを行うには速いだろうと考えている、ことを行うにはかなりの数のアルゴリズムがあります。すべての画像をダウンロードして、Windows Liveフォトギャラリーや類似の画像と一致する他のソフトウェアのようなものにそれらを供給します。 これには数時間かかりますが、イメージマッチングアルゴリズムを実装するにははるかに時間がかかることがあります。その後、現在のシステムを修正してすべてをDBに保存するために余分な時間を費やすことができます。 問題の原因を修正しました。症状ではありません。

+0

質問は "なぜあなたはPHPで類似の画像を検出してはいけないのでしょうか?"ということではありません。なぜPHPで画像を比較する必要があるのか​​を知ることはできません。それを手動で行うと言っても、実際の質問に対する良い答えではありません。 –

0

2つの画像のうち、最も小さい画像を確認し、その画像のサイズを取ってから、矩形サイズ内のピクセルのみを比較してください。

0

まず、あなたの問題はPHPとはほとんど関係がないので、そのタグを削除してより関連性の高いタグを追加しました。


NxNの比較は必要ありません。あなたは、ヒューリスティックの多くを使用することができますが、最初に私がお聞きしたいと思います:

  1. 1つの画像のすべてのコピーが正確に行われ、いくつかのトリミングがある(互いのサイズを変更しています - マッチングは元に画像をトリミングすることができより困難で時間がかかる)?

  2. 同じツールを使用してすべての画像が生成(サイズ変更)されていますか?

  3. サイズ変更に使用したパラメータはどうですか?たとえば、PSPで同じ解像度で表示するすべての写真はありますか?

  4. あなたが持っているユニークな画像の数はどれくらいですか(つまり、各画像のコピーの平均数は?)

  5. 既に分類が行われていますか。たとえば、すべてのモバイルイメージは別のフォルダにありますか(またはPCイメージとは異なる解像度)ですか?これだけで比較の回数を減らすことができます。

あなたはN×N個のcomparisionsを必要としない理由について非常にトップレベルのヒント:あなたは、多くの異なる概算(例えば、高/低周波JPEG係数の分布)のハッシュとグループに「潜在的」類似イメージを考案することができます一緒に。これは、使用されるヒューリスティックの質およびデータセットに依存して、必要とされる比較の数を10〜100倍またはそれ以上に減らすことができる。ハッシングは、画像の一部でも実行できます。あなたが正しい技法を使用するならば、30000は非常に大きな数字ではありません。

+0

はい、クロップされてサイズが変更されました。画像は480x272,800x600,1024x768,1280x 1024,1600x1200,1600x1080,1920x1080,1920x1200 、2560 x 1600。各写真には約3500の固有のイメージがあり、正確なコピーは約9つあります。分類について...私はそれぞれ約1000枚の写真を含む約30のフォルダにこれらの画像を配置しました。サイズ制限を超えるとフォルダが作成されて配置され、ファイル名はランダムになって別の画像が表示されます。 – mrN

+0

その後、各フォルダから約20の画像をランダムに選択し、ファイルリストを作成します。次に、サイズに応じて画像をソートし、それぞれのデバイスに自動的にコピーする機能を実行します。 – mrN

+0

アップロード時にトリミングアルゴリズムが自動的に実行されます。高さに合わせてサイズを変更し、画像を中央に配置します特定の解像度まで、私は通常2560 x 1600の画像サイズを提供します。もし私が大きな画像をアップロードした場合、最初に2560 x 1600の画像が撮影され、元の画像は破棄されます。 – mrN

14

gd2とlib puzzleをサーバーにインストールします。

リビングパズルは驚くほど簡単で、遊びやすいです。このスニペットをチェック

<?php 
# Compute signatures for two images 
$cvec1 = puzzle_fill_cvec_from_file('img1.jpg'); 
$cvec2 = puzzle_fill_cvec_from_file('img2.jpg'); 

# Compute the distance between both signatures 
$d = puzzle_vector_normalized_distance($cvec1, $cvec2); 

# Are pictures similar? 
if ($d < PUZZLE_CVEC_SIMILARITY_LOWER_THRESHOLD) { 
    echo "Pictures are looking similar\n"; 
} else { 
    echo "Pictures are different, distance=$d\n"; 
} 

# Compress the signatures for database storage 
$compress_cvec1 = puzzle_compress_cvec($cvec1); 
$compress_cvec2 = puzzle_compress_cvec($cvec2); 
0

Source:[SOLVED]How to detect similar Images in PHP?

<?php 
/* 
Project: detect similar Images in PHP 
Project url: http://www.cricbell.com 
Author: Ali Kodor Zoarder,Bangladesh 
Version: 1.0.0 
*/ 

$img=new image_match; 

if($img->is_match('z.jpg','y.jpg')){ 
    echo 'same image'; 
}else{ 
    echo 'different image'; 
} 



class image_match{ 
/** 
* Function image byte code othoba jpeg image show korbe 
* @param string $base sotik jpeg image hote hobe 
* @param string $W sotik image width hote hobe 
* @param string $H sotik image height hote hobe 
* @param string $show true or false 
* @return jpeg image 
*/ 
public function create($base,$W=40,$H=40,$show=false){ 
    if($show==true){ 
     header('Content-type: image/jpeg'); 
     header('Cache-Control: public'); 
     header('Pragma: cache'); 
    } 
     list($wn,$hn) = getimagesize($base); 
     $base_image = imagecreatefromjpeg($base); 
     $new = imageCreateTrueColor($W, $H); 
     imageCopyResampled($new, $base_image, 0, 0, 0, 0, $W, $H, $wn, $hn); 
     //imagejpeg($base_image); 
     imageJpeg($new,null,100); 
     imagedestroy($new); 
} 
/** 
* Function ek rokom image ki na ,seta zachai korbe 
* @param string $img_s_a sotik jpeg image hote hobe 
* @param string $img_s_b sotik jpeg image hote hobe 
* @return :true=motlob mil ase::false=motlob mil nei: 
*/ 
public function is_match($img_s_a,$img_s_b){ 
    ob_start(); 
    $this->create($img_s_a,$W=40,$H=40,$show=false); 
    $ia=ob_get_clean(); 

    ob_start(); 
    $this->create($img_s_b,$W=40,$H=40,$show=false); 
    $ib=ob_get_clean(); 
//echo md5($ia); 
    if(preg_match('/'.md5($ia).'/' , md5($ib))){ 
     return true; 
    }else{ 
     return false; 
    } 
} 
} 
関連する問題