49 votes

Détecter la couleur "moyenne globale" de l'image

J'ai une photo (format jpg, par exemple).

J'ai besoin de savoir "moyenne générale" la couleur de l'image. Je veux dire la couleur principale de cette image. Je ne peux pas strictement furmulate ma tâche.

Je citerai un exemple:

alt text

(Image ci-dessus: en haut de l'image d'origine, dans le bas - la "moyenne générale" de la couleur qui est associée à l'image)

Si vous m'aider à formuler une strictement ma tâche, je serai très reconnaissant. À première vue, il peut utiliser l'histogramme de l'image (canal RVB).

Supplément de: au travail, j'utilise principalement le JavaScript et le PHP (un peu de Python) se félicite donc de la décision dans ces langues. Peut-être il ya de la bibliothèque pour travailler avec des images qui répondent à des problèmes similaires.

Supplément NO2:je n'ai pas besoin de déterminer dynamiquement la couleur de l'image. J'ai juste besoin d'une fois d'aller à travers l'ensemble de la matrice d'images et de déterminer la couleur de chacun d'eux séparément (cette information, je me souviendrai pour une utilisation future).

74voto

JKirchartz Points 6237

Vous pouvez utiliser PHP pour obtenir un tableau de la palette de couleurs comme ceci:

 <?php 
function colorPalette($imageFile, $numColors, $granularity = 5) 
{ 
   $granularity = max(1, abs((int)$granularity)); 
   $colors = array(); 
   $size = @getimagesize($imageFile); 
   if($size === false) 
   { 
      user_error("Unable to get image size data"); 
      return false; 
   } 
   $img = @imagecreatefromjpeg($imageFile);
   // Andres mentioned in the comments the above line only loads jpegs, 
   // and suggests that to load any file type you can use this:
   // $img = @imagecreatefromstring(file_get_contents($imageFile)); 

   if(!$img) 
   { 
      user_error("Unable to open image file"); 
      return false; 
   } 
   for($x = 0; $x < $size[0]; $x += $granularity) 
   { 
      for($y = 0; $y < $size[1]; $y += $granularity) 
      { 
         $thisColor = imagecolorat($img, $x, $y); 
         $rgb = imagecolorsforindex($img, $thisColor); 
         $red = round(round(($rgb['red'] / 0x33)) * 0x33); 
         $green = round(round(($rgb['green'] / 0x33)) * 0x33); 
         $blue = round(round(($rgb['blue'] / 0x33)) * 0x33); 
         $thisRGB = sprintf('%02X%02X%02X', $red, $green, $blue); 
         if(array_key_exists($thisRGB, $colors)) 
         { 
            $colors[$thisRGB]++; 
         } 
         else 
         { 
            $colors[$thisRGB] = 1; 
         } 
      } 
   } 
   arsort($colors); 
   return array_slice(array_keys($colors), 0, $numColors); 
} 
// sample usage: 
$palette = colorPalette('rmnp8.jpg', 10, 4); 
echo "<table>\n"; 
foreach($palette as $color) 
{ 
   echo "<tr><td style='background-color:#$color;width:2em;'>&nbsp;</td><td>#$color</td></tr>\n"; 
} 
echo "</table>\n";
 

Ce qui vous donne un tableau dont les valeurs sont plus élevées pour la fréquence d'utilisation de cette couleur.

EDIT Un commentateur a demandé comment l’utiliser sur tous les fichiers d’un répertoire, le voici:

     if ($handle = opendir('./path/to/images')) {

        while (false !== ($file = readdir($handle))) {
           $palette = colorPalette($file, 10, 4);
           echo "<table>\n"; 
           foreach($palette as $color) { 
               echo "<tr><td style='background-color:#$color;width:2em;'>&nbsp;</td><td>#$color</td></tr>\n"; 
           } 
           echo "</table>\n";
        }
        closedir($handle);
    }
 

peut ne pas vouloir faire cela sur trop de fichiers, mais c'est votre serveur.

1voto

S.Lott Points 207588

Commencez avec PIL. http://www.pythonware.com/products/pil/

Ouvrez l'objet Image. Utilisez la méthode getdata pour obtenir tous les pixels. Faites la moyenne des valeurs que vous récupérez.

Quelque chose comme ça.

http://stackoverflow.com/questions/2270874/image-color-detection-using-python

1voto

Une solution plus courte pour une image en vraies couleurs serait de la réduire à une taille de 1x1 pixel et d’échantillonner la couleur à ce pixel:

$ scaled = imagescale ($ img, 1, 1, IMG_BICUBIC); $ meanColor = imagecolorat ($ img, 0, 0);

... mais je n'ai pas testé cela moi-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X