LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-07

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

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

1
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0