画像が単色かどうかの判定をしたくって、いろいろ調べてたんですが、簡単に調べる方法がなさそうなんですよね
考えた結果、RGBの分散求めて0だったら単色と判断したら良いんじゃないかと
numpyとか使えばぱぱっと分散計算できるんですが、これだけのためにnumpyとか入れたくないなぁと思い、標準ライブラリとPillowだけで実装しました
from PIL import Image
rgb = list(Image.open(que.image).getdata())
avg_rgb = [sum(x)/len(rgb) for x in zip(*rgb)]
var_rgb = [sum(map(lambda p: (p - a) ** 2, x)) / len(x) for x, a in zip([t for t in zip(*rgb)], avg_rgb)]
std = sqrt(sum(var_rgb))
これで、sum(var_rgb)==0
で単色なはず
追記 : 分散が0だとちょっきり単色すぎて、使い物にならない。標準偏差まで計算して、使うのが良い。しきい値は判定したいものによるが、25ぐらいで実用的には良さそう
そういえば、PillowのImageからRGBを取得するところでdecoder jpeg not available
とうエラーが出まして
brew install libjpeg
pip uninstall pillow
pip install pillow
で治りました。libjpegが入ってなかった、pillowのバージョンが古かったっぽいですね。