2016-06-02 17 views
5

Attualmente ho una singola immagine da cui sto recuperando un colore di sfondo. Sto rendendo trasparente il colore di sfondo, quindi sto tentando di confrontarlo con l'immagine originale per determinare la percentuale dell'immagine che è composta da detto colore di sfondo. Ecco il codice che sto cercando di utilizzare:Percentuale di pixel che sono stati modificati in un'immagine in PHP

$image = new Imagick($file); 

// Make bg transparent for comparison 
$tpImage = $image->clone(); 
$tpImage->setFormat('png'); 
$tpImage->setImagePage(0, 0, 0, 0); 

$swatch_pixel = $tpImage->getImagePixelColor(1, 1); 

$tpImage->paintTransparentImage($swatch_pixel, 0, 65535 * 0.1); 

$image->SetOption('fuzz', '2%'); 
$result = $image->compareImages($tpImage, Imagick::METRIC_ABSOLUTEERRORMETRIC); 

echo $result[0]; 

Attualmente questo è sempre tornando 0 ... Io non sono sicuro se ho bisogno di usare un metodo di confronto diverso o quello, o se sto facendo qualcosa di diverso sbagliato, ho passato un po 'di tempo su questo e la maggior parte delle risorse che ho trovato sono piuttosto vecchie.

+1

Provare a utilizzare '$ immagine-> identifyFor mat ("% [distorsione]") 'per raccogliere la metrica dopo aver eseguito' $ image-> compareImages() ' –

+0

La mia risposta di seguito ha risolto il problema? In tal caso, considera di accettare come risposta - facendo clic sul segno di spunta verde vuoto/segno di spunta accanto al conteggio dei voti. In caso contrario, si prega di dire cosa non ha funzionato in modo che io, o qualcun altro, possa aiutarti ulteriormente. Grazie. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

risposta

1

Aggiornato risposta

In realtà, ora che si punta esplicitamente, la metrica ABSOLUTE_ERROR non funzionerà quando l'unica differenza è la trasparenza.

Per rispondere alla tua domanda, probabilmente si desidera solo per separare il canale alfa utilizzando:

separateImageChannel(Imagick::CHANNEL_ALPHA); 

e quindi ottenere la sua media statistica che vi dirà qual è la percentuale dei pixel bianco - cioè trasparente.

Lascerò la risposta originale di seguito, perché è una tecnica utile che funzionerà per qualsiasi altra differenza di immagine che non sia puramente di trasparenza.

risposta originale

È possibile ottenere le proprietà dell'immagine dopo il confronto e trovare l'elemento chiamato "distorsione" in là. Quindi, se inizio con questa immagine:

enter image description here

e poi rotolare a destra per 10 pixel:

enter image description here

<?php 
    $image1 = new Imagick("image.png"); 
    $image2 = new Imagick("image.png"); 

    $result = $image1->compareImages($image2,Imagick::METRIC_MEANABSOLUTEERROR); 
    $p1=$image1->getImageProperties(); 
    print_r($p1); 
    $image1->rollImage(10,0); 
    $result = $image1->compareImages($image2,Imagick::METRIC_MEANABSOLUTEERROR); 
    $p1=$image1->getImageProperties(); 
    print_r($p1); 
?> 

uscita

Array 
(
    [date:create] => 2016-06-02T14:15:01+01:00 
    [date:modify] => 2016-06-02T14:15:01+01:00 
    [distortion] => 0       <--- Here's the little devil 
    [png:bKGD] => chunk was found (see Background color, above) 
    [png:cHRM] => chunk was found (see Chromaticity, above) 
    [png:gAMA] => gamma=0.45454544 (See Gamma, above) 
    [png:IHDR.bit-depth-orig] => 4 
    [png:IHDR.bit_depth] => 4 
    [png:IHDR.color-type-orig] => 3 
    [png:IHDR.color_type] => 3 (Indexed) 
    [png:IHDR.interlace_method] => 0 (Not interlaced) 
    [png:IHDR.width,height] => 200, 200 
    [png:PLTE.number_colors] => 5 
    [png:sRGB] => intent=0 (Perceptual Intent) 
    [png:text] => 2 tEXt/zTXt/iTXt chunks were found 
    [png:tIME] => 2016-06-02T14:15:01Z 
) 
Array 
(
    [date:create] => 2016-06-02T14:15:01+01:00 
    [date:modify] => 2016-06-02T14:15:01+01:00 
    [distortion] => 0.0833333      <--- Here's the little devil 
    [png:bKGD] => chunk was found (see Background color, above) 
    [png:cHRM] => chunk was found (see Chromaticity, above) 
    [png:gAMA] => gamma=0.45454544 (See Gamma, above) 
    [png:IHDR.bit-depth-orig] => 4 
    [png:IHDR.bit_depth] => 4 
    [png:IHDR.color-type-orig] => 3 
    [png:IHDR.color_type] => 3 (Indexed) 
    [png:IHDR.interlace_method] => 0 (Not interlaced) 
    [png:IHDR.width,height] => 200, 200 
    [png:PLTE.number_colors] => 5 
    [png:sRGB] => intent=0 (Perceptual Intent) 
    [png:text] => 2 tEXt/zTXt/iTXt chunks were found 
    [png:tIME] => 2016-06-02T14:15:01Z 
) 
+0

Questo esempio funziona ma quando provo a confrontare le mie immagini ottengo ancora 0. Mi chiedo se la sua qualcosa a che fare con il confronto di 2 immagini con solo trasparenza diversa? Dal momento che il valore del colore non cambia, credo solo al valore alfa. Per favore fatemi sapere cosa ne pensate ... – Mazzy

+0

Se si utilizza la metrica ABSOLUTE_ERROR, la trasparenza viene ignorata. Penso che se provi RMSE_ERROR terrà conto della trasparenza. Potrebbe essere necessario rendere tutti i pixel trasparenti bianchi e tutti i pixel opachi neri, quindi ottenere l'immagine media per determinare la percentuale di pixel bianchi. Vai a http://www.imagemagick.org/Usage/compare/ e cerca su quella pagina per '56755' e leggi quel paragrafo. –

+0

Ho aggiornato la risposta. –

Problemi correlati