'How to check if an RGB image contains only one color?
I'm using Python and PIL.
I have images in RGB and I would like to know those who contain only one color (say #FF0000 for example) or a few very close colors (#FF0000 and #FF0001).
I was thinking about using the histogram but it is very hard to figure out something with the 3 color bands, so I'm looking for a more clever algorithm.
Any ideas?
ImageStat module is THE answer! Thanks Aaron. I use ImageStat.var to get the variance and it works perfectly.
Here is my piece of code:
from PIL import Image, ImageStat
MONOCHROMATIC_MAX_VARIANCE = 0.005
def is_monochromatic_image(src):
v = ImageStat.Stat(Image.open(src)).var
return reduce(lambda x, y: x and y < MONOCHROMATIC_MAX_VARIANCE, v, True)
Solution 1:[1]
Try the ImageStat module. If the values returned by extrema are the same, you have only a single color in the image.
Solution 2:[2]
First, you should define a distance between two colors. Then you just have to verify for each pixel that it's distance to your color is small enough.
Solution 3:[3]
Here's a little snippet you could make use of :
import Image
im = Image.open("path_to_image")
width,height = im.size
for w in range(0,width):
for h in range(0,height):
# this will hold the value of all the channels
color_tuple = im.getpixel((w,h))
# do something with the colors here
Maybe use a hash and store the tuples as the key and it's number of appearances as value?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Aaron Digulla |
| Solution 2 | SmuK |
| Solution 3 | Geo |
