Je voulais juger si l'image était monochromatique, j'ai donc cherché de diverses manières, mais il ne semble pas y avoir de moyen facile de la vérifier.
En conséquence, si la distribution RVB est de 0, elle doit être jugée comme une seule couleur.
Si vous utilisez numpy ou quelque chose comme ça, vous pouvez faire des calculs distribués rapidement, mais je ne voulais pas mettre numpy juste pour cela, donc je l'ai implémenté uniquement avec la bibliothèque standard et 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))
Maintenant, il devrait être monochromatique avec sum (var_rgb) == 0
Post-scriptum: Si la dispersion est de 0, elle est un peu trop monochromatique et inutilisable. Il est bon de calculer jusqu'à l'écart type et de l'utiliser. Le seuil dépend de ce que vous voulez juger, mais environ 25 semble être bon pour une utilisation pratique.
En parlant de cela, j'ai eu une erreur disant «décodeur jpeg non disponible» lors de l'obtention du RVB à partir de Pillow's Image.
brew install libjpeg
pip uninstall pillow
pip install pillow
Guéri avec. Il semble que la version de l'oreiller, qui n'incluait pas libjpeg, était ancienne.
Recommended Posts