Search code examples
pixelgraphicsmagick

color pixel count with GraphicsMagick


I need to count pixels in an image that are not background color. I am calling this from PHP (it's from ImageMagick):

gm convert test.png -fill black +opaque "rgb(255,255,255)" -fill white -opaque "rgb(255,255,255)" -print "pixels = %[fx:w*h*mean]\n"

But it does not give any result, nothing. I tried using histogram instead:

gm convert test.png -define histogram:unique-colors=true -format %c histogram:info.txt

That works, but gives values for every color and more details, I just need a single number please.


Solution

  • You have got a couple of issues here. You seem to be trying to mix GraphicsMagick with ImageMagick when they are not the same thing.

    Firstly, GraphicsMagick does not have the +opaque operator that ImageMagick has.

    Secondly, it doesn't have the -fx operator that ImageMagick has for doing maths.

    I would suggest you move to, the more powerful, ImageMagick. Then it will work as you expect:

    # Create a test image
    convert -size 200x200 xc:black xc:white xc:red +append image.png
    

    enter image description here

    # Count the white pixels
    convert image.png -fill black +opaque "rgb(255,255,255)" -print "pixels = %[fx:w*h*mean]\n" nul:
    pixels = 40000
    

    If you really, really must do it with GraphicsMagick, I can only suggest the following - which is heavily based on @GlennRanders-Pehrson answer here:

    gm convert image.png +matte -matte -transparent white -operator matte negate 1 result.png
    
    gm identify -verbose result.png | grep -EA5 "Opacity:|Geometry:" | grep -E "Mean|Geometry"
      Geometry: 600x200
      Mean:                    43690.00 (0.6667)
      Mean:                    43690.00 (0.6667)
    

    And your answer will be:

    600 * 200 * (1 - 0.667)