使用Python测量图像的对比度

问题描述 投票:0回答:1

我有一个亮度的代码,目前正在研究测量对比度。

from PIL import Image
from math import sqrt
imag = Image.open("../Images/noise.jpg")

imag = imag.convert ('RGB')
imag.show()

X,Y = 0,0

pixelRGB = imag.getpixel((X,Y))
R,G,B = pixelRGB
brightness = sum([R,G,B])/3 ##0 is dark (black) and 255 is bright (white)
print(brightness)
print(R,G,B)

当然,对比度可以是这个代码的模拟,有什么想法就好了,谢谢。

python-imaging-library measure contrast
1个回答
1
投票

不同的人对对比度有不同的想法......一种方法是看图像中最亮的像素和最暗的像素之间的差异,另一种方法是看像素远离平均值的标准差。还有其他的统计方法。注意,这需要看 图像中的像素--而不仅仅是第一个像素。

查看图像统计的最简单方法是使用PIL的 ImageStat 函数。

#!/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]}')

所以,如果我创建一个灰度图像,像这样用... ... 图像魔术:

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

如果最小值和最大值很接近,对比度就很低。如果最小值和最大值间距较大,则对比度较高。同样,标准差也是如此,因为它衡量的是 "摊开" 的像素在整个直方图中。

© www.soinside.com 2019 - 2024. All rights reserved.