it-swarm.com.de

Hauptfarben in einem Bild mit erkennen PHP

Ich versuche, die Funktionalität von Dribbble.com mit dem Erkennen der vorherrschenden Farben in einem Bild zu replizieren. Im Bild unten sehen Sie einen Screenshot von Dribbble.com, der die 8 vorherrschenden Farben im Bild links zeigt. Hier ist die aktuelle Seite im Bild http://dribbble.com/shots/528033-Fresh-Easy?list=following

Ich muss in der Lage sein, dies in PHP zu tun. Sobald ich die Farben habe, die ich brauche, werde ich sie in einer Datenbank speichern, sodass die Verarbeitung nicht bei jeder Seitenladung ausgeführt werden muss. 

Nach einigen Nachforschungen, wie man diese Farben aus einem Bild herausholen kann, sagten einige Leute, Sie würden ein Bild einfach Pixel für Pixel untersuchen und dann die Farben speichern, die am häufigsten vorkommen. Andere sagen, es steckt mehr dahinter und dass die Farben, die am häufigsten vorkommen, nicht den gewünschten Effekt haben. Sie sagen, Sie müssen das Bild/die Farben quantisieren (ich bin an diesem Punkt verloren).

Im Bild unten ist die Dribble-Aufnahme unten eine Javascript-Bibliothek, die dasselbe tut, diese Seite kann hier angesehen werden http://lokeshdhakar.com/projects/color-thief/

Wenn ich den Quellcode dieser Seite sehe, kann ich sehen, dass es eine Javascript-Datei mit dem Namen quantize.js gibt und die Ergebnisse wirklich gut sind. Ich hoffe also in der Lage zu sein, was die Javascript-Bibliothek tun kann, aber mit PHP und Gd/ImageMagick 

enter image description here


Ich hatte diese Funktion gefunden, die die Farben zurückgibt und in einem Bild mit PHP zählt, aber die Ergebnisse unterscheiden sich von der obigen JavaScript-Version und den Dribble-Ergebnissen

/**
 * Returns the colors of the image in an array, ordered in descending order, where the keys are the colors, and the values are the count of the color.
 *
 * @return array
 */
function Get_Color()
{
    if (isset($this->image))
    {
        $PREVIEW_WIDTH    = 150;  //WE HAVE TO RESIZE THE IMAGE, BECAUSE WE ONLY NEED THE MOST SIGNIFICANT COLORS.
        $PREVIEW_HEIGHT   = 150;
        $size = GetImageSize($this->image);
        $scale=1;
        if ($size[0]>0)
        $scale = min($PREVIEW_WIDTH/$size[0], $PREVIEW_HEIGHT/$size[1]);
        if ($scale < 1)
        {
            $width = floor($scale*$size[0]);
            $height = floor($scale*$size[1]);
        }
        else
        {
            $width = $size[0];
            $height = $size[1];
        }
        $image_resized = imagecreatetruecolor($width, $height);
        if ($size[2]==1)
        $image_orig=imagecreatefromgif($this->image);
        if ($size[2]==2)
        $image_orig=imagecreatefromjpeg($this->image);
        if ($size[2]==3)
        $image_orig=imagecreatefrompng($this->image);
        imagecopyresampled($image_resized, $image_orig, 0, 0, 0, 0, $width, $height, $size[0], $size[1]); //WE NEED NEAREST NEIGHBOR RESIZING, BECAUSE IT DOESN'T ALTER THE COLORS
        $im = $image_resized;
        $imgWidth = imagesx($im);
        $imgHeight = imagesy($im);
        for ($y=0; $y < $imgHeight; $y++)
        {
            for ($x=0; $x < $imgWidth; $x++)
            {
                $index = imagecolorat($im,$x,$y);
                $Colors = imagecolorsforindex($im,$index);
                $Colors['red']=intval((($Colors['red'])+15)/32)*32;    //ROUND THE COLORS, TO REDUCE THE NUMBER OF COLORS, SO THE WON'T BE ANY NEARLY DUPLICATE COLORS!
                $Colors['green']=intval((($Colors['green'])+15)/32)*32;
                $Colors['blue']=intval((($Colors['blue'])+15)/32)*32;
                if ($Colors['red']>=256)
                $Colors['red']=240;
                if ($Colors['green']>=256)
                $Colors['green']=240;
                if ($Colors['blue']>=256)
                $Colors['blue']=240;
                $hexarray[]=substr("0".dechex($Colors['red']),-2).substr("0".dechex($Colors['green']),-2).substr("0".dechex($Colors['blue']),-2);
            }
        }
        $hexarray=array_count_values($hexarray);
        natsort($hexarray);
        $hexarray=array_reverse($hexarray,true);
        return $hexarray;

    }
    else die("You must enter a filename! (\$image parameter)");
}

Ich frage also, ob jemand weiß, wie ich eine solche Aufgabe mit PHP erledigen kann? Möglicherweise gibt es bereits etwas, das Sie kennen oder irgendwelche Tipps, die mir einen Schritt näher kommen, wenn Sie dies tun würden

27
JasonDavis

Genau das, wonach Sie in PHP suchen: https://github.com/thephpleague/color-extractor

Beispiel:

require 'vendor/autoload.php';

use League\ColorExtractor\Client as ColorExtractor;

$client = new ColorExtractor;

$image = $client->loadPng('./some/image.png');

// Get the most used color hexadecimal codes from image.png
$palette = $image->extract();
32
Epoc

Dies ist meine einfache Methode, um die Hauptfarbe eines Bildes zu erhalten

<?php 

  $image=imagecreatefromjpeg('image.jpg');
  $thumb=imagecreatetruecolor(1,1); imagecopyresampled($thumb,$image,0,0,0,0,1,1,imagesx($image),imagesy($image));
    $mainColor=strtoupper(dechex(imagecolorat($thumb,0,0)));
  echo $mainColor;

?>
12
Emanuel Cuccato

Sie müssen das Bild verkleinern und erhalten die Hauptfarben des Bildes. Wenn Sie 4 Farben in der Palette benötigen, skalieren Sie sie auf ca. 8x8, 6 Farben auf ca. 12x8 usw.

imagecopyresized für verkleinertes Bild, dann alle Pixel überprüfen und in Array imagecolorat($image,px,py) speichern

Probieren Sie es aus

<?php

// EXAMPLE PICTURE
$url='https://www.nordoff-robbins.org.uk/sites/default/files/google.jpg';

//var_dump(getColorPallet($url));

echoColors(getColorPallet($url));


function echoColors($pallet){ // OUTPUT COLORSBAR
    foreach ($pallet as $key=>$val)
        echo '<div style="display:inline-block;width:50px;height:20px;background:#'.$val.'"> </div>';
}

function getColorPallet($imageURL, $palletSize=[16,8]){ // GET PALLET FROM IMAGE PLAY WITH INPUT PALLET SIZE
    // SIMPLE CHECK INPUT VALUES
    if(!$imageURL) return false;

    // IN THIS EXEMPLE WE CREATE PALLET FROM JPG IMAGE
    $img = imagecreatefromjpeg($imageURL);

    // SCALE DOWN IMAGE
    $imgSizes=getimagesize($imageURL);

    $resizedImg=imagecreatetruecolor($palletSize[0],$palletSize[1]);

    imagecopyresized($resizedImg, $img , 0, 0 , 0, 0, $palletSize[0], $palletSize[1], $imgSizes[0], $imgSizes[1]);

    imagedestroy($img);

    //CHECK IMAGE
    /*header("Content-type: image/png");
    imagepng($resizedImg);
    die();*/

    //GET COLORS IN ARRAY
    $colors=[];

    for($i=0;$i<$palletSize[1];$i++)
        for($j=0;$j<$palletSize[0];$j++)
            $colors[]=dechex(imagecolorat($resizedImg,$j,$i));

    imagedestroy($resizedImg);

    //REMOVE DUPLICATES
    $colors= array_unique($colors);

    return $colors;

}
?>

Funktioniert perfekt für mich.

6
Dust999

Die Seite, auf die Sie verlinkt haben, enthält einen Link zum Quellcode in GitHub. Wenn Sie also genau wissen möchten, wie sie vorgehen, können Sie ihren Quellcode in PHP replizieren.

Der große Unterschied zwischen der Art und Weise, wie sie es tun und wie Sie es tun, ist, dass sie Clustering verwenden, um die Farbe zu finden. Anstatt die Farbe beim Speichern abzurunden, werden alle rohen Farben in einem Array gespeichert. Dann durchlaufen sie dieses Array, bis sie einen Cluster finden, der das höchste Verhältnis von Punkten im Cluster zur Anzahl der Farben im Cluster aufweist. Der Mittelpunkt davon ist die am häufigsten vorkommende Farbe. Die Palette wird dann durch die nächsthöheren Gruppen von Clustern definiert, wobei eine gewisse Logik verwendet wird, um eine nahezu vollständige Überlappung der Cluster zu verhindern.

3
Alex N.

Ich habe ein Unix-Bash-Shell-Skript mit ImageMagick namens dominantcolor, das tun kann, was Sie wollen. Siehe meine Skripts-Website unter http://www.fmwconcepts.com/imagemagick/index.php . Sie können es von PHP exec () ausführen. Siehe meine Hinweise zur Verwendung auf meiner Homepage.

Eingang:

 enter image description here

dominantcolor -n 6 -p all -s save plate.png

count,hexcolor
586,#5ECADC
520,#AFA85D
469,#3C3126
462,#B9C8BB
258,#488A70
205,#B06928


-N 6 ist die gewünschte Anzahl von Farben bei der Farbquantisierung. Das -p all bedeutet, dass alle Zählungen und Farben für die resultierenden 6 Farben gedruckt werden. Der -s-Speicher gibt an, ein Farbfeldbild zu speichern.

Die Farben unten werden mit der dominanten Farbe auf der linken Seite und abnehmenden Farben nach rechts gemäß der obigen Liste angezeigt.

 enter image description here

1
fmw42

Versuchen Sie Folgendes: http://www.coolphptools.com/color_extract

Funktioniert mit JPEG und PNG.

Und das Beste !: Kein Stress mit dem Komponisten, nur Require_once

require_once 'colorextract/colors.inc.php';
$ex=new GetMostCommonColors();
$num_results=20;
$reduce_brightness=1;
$reduce_gradients=1;
$delta=24;
$colors=$ex->Get_Color( 'image.png', $num_results, $reduce_brightness, $reduce_gradients, $delta);
print_r($colors);

gib dir so etwas:

Array ( [3060a8] => 0,55827380952381 .__ [f0a848] => 0,1979166666666667 > 0,069642857142857 .__ [483018] => 0,02047619047619 [183060] => 0.01797619047619. [4878a8] => 0.016011904761905. [181860] => 0.015119047619048 .__ [a87830] => 0.014345238095238 .__ [a8c0d0440 0.01172619047619 [D89030] => 0.011011904761905 [90a8d8] => 0,0071428571428571 [Ffffff] = 0,0070238095238095. d8d8f0] => 0,005297619047619 [c0d8d8] => 0,0044047619047619 [f0f0ff] => 0,00041666666666667 .__ [181830] => 0,00011904761904762)

Ich habe es mit verschiedenen Bildern ausprobiert und es scheint zuverlässig zu sein.

0
Juergen

Die Idee, die vorherrschenden Farben des Bildes zu erhalten, ist etwas knifflig, weil zum Beispiel die häufigste Pixelfarbe im Bild so stark gestreut sein könnte, dass sie überhaupt nicht als vorherrschende Farbe wahrgenommen wird. 

Ich denke, ein Algorithmus wie der Color-Kohärenzvektor ist gut genug, um dieses Problem zu lösen, da er die Farben zu kohärenten und inkohärenten Farben zusammenfasst (was ziemlich intuitiv ist), und dann können Sie diese falsch positiven, vorherrschenden Farben verwenden . 

Ich sehe, es ist ein einfacher Algorithmus zu implementieren. Dieses Tutorial Image Retrieval: Colour Coherence Vector beschreibt beschreibt seine Schritte anhand von Beispielen, wie es funktioniert, und am Ende wird sogar eine matlab -Implementierung erwähnt.

0
v.tmab