Python
statistics

Pythonの標準ライブラリとPillowで分散を画像のRGBの標準偏差を求めて、単色かどうかを判定する

More than 1 year has passed since last update.

画像が単色かどうかの判定をしたくって、いろいろ調べてたんですが、簡単に調べる方法がなさそうなんですよね

考えた結果、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のバージョンが古かったっぽいですね。