Anna
Anna

Reputation: 2845

How to select all grayscale colors?

In ImageMagick convert, I can select a specific color with e.g. -opaque blue. How can I select all grayscale colors (e.g. #000000, #707070, #ffffff)?

Upvotes: 1

Views: 136

Answers (1)

Mark Setchell
Mark Setchell

Reputation: 207465

Not sure what you are trying to do, but this may help. The greyscale pixels will have a saturation of zero, so that is probably the easiest way to identify them.

First, make a funky sample image:

 convert -size 400x100 gradient:black-white -bordercolor red -border 80 image.png

enter image description here

Now make all grey areas (those with very low saturation) transparent:

convert image.png -alpha on -channel A -fx "saturation<0.01?0:1" result.png

enter image description here

Note

Note that the -fx operator is extremely powerful but notoriously slow because it is actually interpolated for each and every pixel. If your images are large, the following technique may be more appropriate.

Basically, I clone the image and convert the whole thing to HSL colorspace and separate the channels. Then I discard the Hue and Lightness channels so I am left with just the Saturation. I then threshold that and copy that back to the original image as the alpha channel. On a 2000x2000 pixel image, this method will run in under a second whereas the -fx method will require 5-6 seconds.

convert image.png \( +clone -colorspace hsl -separate -delete 0,2 -threshold 1% \) -compose copy-opacity -composite result.png

Upvotes: 1

Related Questions