Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find average color of an image with ImageMagick?

Tags:

imagemagick

How do I get the RGB values of the average color of an image, where each value is 0-255? Such as "255,255,255"

I run this command to shrink the image down and it returns the 'rgba' value with the alpha channel and sometimes it gives text color names:

convert cat.png -resize 1x1\! -format "%[pixel:u]\n" info:

Output:

rgba(155,51,127,0.266087)
like image 929
jaredcohe Avatar asked Aug 25 '14 14:08

jaredcohe


3 Answers

There are two aspects to my answer:

  1. Resize the original image to a 1-pixel-image. This pixel then will have the "average" color as ImageMagick's convert sees it.
  2. Output the result as the special .txt format supported by convert. This text format enumerates all pixels of an image, giving first its coordinates ($row,$column:), then its RGB or CMYK values in different formats.

Here is a command which covers both aspects in one:

convert cat.png -resize 1x1 out.txt
cat out.txt

To get the output directly in the terminal window, you could use:

convert cat.png -resize 1x1 txt:-

Example output:

convert p4.png -resize 1x1 txt:-
  # ImageMagick pixel enumeration: 1,1,255,srgb
  0,0: (189,185,184)  #BDB9B8  srgb(189,185,184)
like image 178
Kurt Pfeifle Avatar answered Nov 16 '22 22:11

Kurt Pfeifle


You can do the following to parse out just the comma-separated RGB values. It also will not return text color names.

convert cat.png -resize 1x1\! \
    -format "%[fx:int(255*r+.5)],%[fx:int(255*g+.5)],%[fx:int(255*b+.5)]" info:-

Output format should look like:

155,51,127

This should work in ImageMagick 6.3.9.1+

like image 43
Shawn Aukstak Avatar answered Nov 16 '22 23:11

Shawn Aukstak


The C# way, using the NuGet Magick.Net package(s) and borrowing from the command line examples.

ImageMagick.IMagickColor<ushort> color;
using (ImageMagick.MagickImage image = new ImageMagick.MagickImage(file))
{
    // Get average color
    image.Resize(1, 1);
    color = image.GetPixels().First().ToColor();
}
like image 1
Chuck Savage Avatar answered Nov 16 '22 21:11

Chuck Savage