如何计算一张图片的对比度?

5
假设我有一张 opencvBGR 图像 img,如何计算该图像的对比度?
2个回答

17

对比度的一个定义是RMS对比度,可以通过以下方式计算:

首先,将BGR图像img转换为灰度图像:

img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

最后,计算灰度图像像素强度的标准差:

contrast = img_grey.std()

2
RMS对比度并不是唯一的对比度定义。我发现韦伯和迈克尔逊更为常见。 - Piglet
1
@Piglet 欢迎自由发表您认为更相关的答案,我刚刚更新了我的回答,澄清了我提供的是RMS对比度计算的解决方案。 - Franco Piccolo
1
这个std()函数有没有任何文档? - Nathan B
@NadavB std() 是数组中数值的标准差。 - Franco Piccolo

7
这里有一个对比度的测量方法:米氏对比法,以及如何在Python/OpenCV/Numpy中计算它。低对比度接近于零,高对比度接近于一。使用来自YUV或YCbCr的Y(强度)通道,或者使用LAB中的L通道,甚至只需将图像转换为灰度并使用该通道即可。
输入: enter image description here
import cv2
import numpy as np

# load image as YUV (or YCbCR) and select Y (intensity)
# or convert to grayscale, which should be the same.
# Alternately, use L (luminance) from LAB.
img = cv2.imread("barn.jpg")
Y = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)[:,:,0]

# compute min and max of Y
min = np.min(Y)
max = np.max(Y)

# compute contrast
contrast = (max-min)/(max+min)
print(min,max,contrast)

0 255 1.0

对比度将在0和1之间。


马克,我没有看到 sat。我哪里打错了? - fmw42
1
马克,谢谢。问题已解决!我看了那个问题10遍,却一直没发现。我从另一个帖子中复制并编辑,结果忽略了那个问题。对不起,大家。 - fmw42
我想知道这通常在实际中如何应用?总是在去噪之后吗?先分割再平均整个图像的对比度? - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接