У разных людей разные представления о контрасте ... один метод - посмотреть разницу между самым ярким и самым темным пикселями изображения, другой - посмотреть на стандартное отклонение пикселей от среднего. Есть и другая статистика. Обратите внимание, что для этого нужно смотреть на все пиксели изображения, а не только на первые.
Самый простой способ посмотреть статистику изображения - использовать функцию ImageStat
PIL:
#!/usr/bin/env python3
from PIL import Image, ImageStat
# Load image
im = Image.open('image.png')
# Calculate statistics
stats = ImageStat.Stat(im)
for band,name in enumerate(im.getbands()):
print(f'Band: {name}, min/max: {stats.extrema[band]}, stddev: {stats.stddev[band]}')
Итак, если я создаю изображение в оттенках серого, подобное этому, с помощью ImageMagick :
magick -size 1024x768 gradient:"rgb(64,64,64)-rgb(200,200,200)" -depth 8 image.png
и запускаю указанный выше код, я получаю:
Band: L, min/max: (64, 200), stddev: 39.31443755161709
Если я создаю пурпурно-черный градиент:
magick -size 1024x768 gradient:magenta-black -depth 8 image.png
и запускаю код, я получаю:
Band: R, min/max: (0, 255), stddev: 73.68457550034924
Band: G, min/max: (0, 0), stddev: 0.0
Band: B, min/max: (0, 255), stddev: 73.68457550034924
Если минимальное и максимальное значения близки, контраст низкий. Если минимальное и максимальное значения широко разнесены, контраст высокий. Точно так же стандартное отклонение, поскольку оно измеряет, насколько «растекаются» пиксели по гистограмме.