2011-07-14 4 views
-1

Depuis quelques jours, je suis coincé sur une tâche impliquant la comparaison d'images en utilisant PHP. Je commence à penser que PHP n'est pas le langage pour faire ce genre de tâche.PHP .png Lineart Comparaison

L'objectif:

Utiliser une base, comparer une nouvelle ligne art, et retourner la différence en pourcentage entre eux. J'ai essayé plusieurs façons d'y arriver: Comparez les différences de nombre de pixels (ce qui ne résout pas vraiment le but de la différence de dessin), faites tous les pixels qui se chevauchent, blancs, et trouvez les pixels sans transparence. couleur blanche et diviser par pixels non transparents dans la base (ce qui ne semble pas obtenir le nombre correct)

Voici un exemple:

Baseenter image description here

- - - - - - - - Base - - - - - - - - - - - Line-Art - - - - - - -

La différence en pourcentage devrait être d'environ 54%. Cependant, aucune des façons que j'ai essayé de fermer (~5%) à cela.

Ma question est: Peut/Comment cela peut-il être fait en PHP? Merci!

Images © Aywas.com

+0

Pas moyen de faire ça avec votre PHP hors de la boîte. –

+2

@brady: PHP supporte [gd] (http://php.net/manual/book.image.php) et [ImageMagick] (http://php.net/manual/book.imagick.php) ... donc c'est possible. –

+0

@Justin, je ne pense pas à la marge d'erreur qu'il essaie d'atteindre. J'ai utilisé GD sur de nombreux projets et je ne peux pas imaginer ce niveau de précision avec ça. J'aimerais voir quelqu'un m'émerveiller de la façon de le faire. –

Répondre

0

Vous pouvez essayer d'utiliser la fonction ImageMagick compareimagechannels(), en utilisant uniquement le canal noir?

Édition: Voici une tentative de base et sa sortie. Vous pourriez être en mesure de manipuler les numéros de sortie pour déterminer vos seuils. Images 1 et 2 sont le dessin au trait et l'image 3 est le logo de l'en-tête de Google redimensionné à 200x200.

$img1 = new Imagick('image1.png'); 
$img2 = new Imagick('image2.png'); 
$img3 = new Imagick('image3.png'); 

$diff12 = $img1->compareImageChannels($img2, 
      Imagick::CHANNEL_ALL, Imagick::METRIC_MEANABSOLUTEERROR); 
$diff13 = $img1->compareImageChannels($img3, 
      Imagick::CHANNEL_ALL, Imagick::METRIC_MEANABSOLUTEERROR); 

print_r($diff12); 
print_r($diff13); 

Sortie:

Array 
(
    [0] => Imagick Object 
     (
     ) 

    [1] => 1512.25385625 
) 
Array 
(
    [0] => Imagick Object 
     (
     ) 

    [1] => 24353.6380375 
)