我需要返回图像的(平均)对比度值。
这可能吗,如果可以,请说明如何?
我应该在什么颜色空间上工作而不仅仅是代码(显然是受欢迎的代码)? HSV是合适的还是最好的?可以计算单个像素的对比度值吗?
最佳答案
可以使用全局上的最大值和最小值从任何强度(I)(例如LAB中的L或HSI中的I或HSV中的V或YCbCr中的Y)(甚至来自去饱和度的图像的灰度版本)的任何强度(I)计算对比度或每个像素周围某个区域的平均值。经常使用LAB颜色空间,但是我不知道是否有关于“最佳”的普遍共识。
一个公式是:
对比度=(Imax-Imin)/(Imax + Imin)
参见here
1) Convert the image to say LAB and get the L channel
2) Compute the max for an NxN neighborhood around each pixel
3) Compute the min for an NxN neighborhood around each pixel
4) Compute the contrast from the equation above at each pixel.
5) Compute the average for all pixels in the result of step 4)
其中N是一些小整数,例如5或7。
使用ImageMagick(unix语法),它将是:
magick zelda1.jpg -colorspace LAB -channel 0 -separate +channel \
\( -clone 0 -statistic maximum 5x5 \) \
\( -clone 0 -statistic minimum 5x5 \) \
\( -clone 1 -clone 2 +swap -define compose:clamp=off -compose minus -composite \) \
\( -clone 1 -clone 2 +swap -define compose:clamp=off -compose plus -composite \) \
-delete 0-2 \
+swap -define compose:clamp=off -compose divide -composite \
-scale 1x1! -format "%[fx:100*u]\%" info:
17.4745%
1个像素的对比度实际上是上面给定像素周围3x3邻域的公式。邻域可以包含所有8个周围像素,或者仅包含给定像素周围的顶部,底部,左侧,右侧像素。
单个像素本身不能具有对比度。对比度是一个相对(差异)概念,因此至少在两个像素之间。
请注意,NxN结构元素的腐 eclipse 和扩张等效于最小值和最大值。
这是OpenCV中的代码:
#!/bin/python3.7
import cv2
import numpy as np
# read image
img = cv2.imread("zelda1.jpg")
# convert to LAB color space
lab = cv2.cvtColor(img,cv2.COLOR_BGR2LAB)
# separate channels
L,A,B=cv2.split(lab)
# compute minimum and maximum in 5x5 region using erode and dilate
kernel = np.ones((5,5),np.uint8)
min = cv2.erode(L,kernel,iterations = 1)
max = cv2.dilate(L,kernel,iterations = 1)
# convert min and max to floats
min = min.astype(np.float64)
max = max.astype(np.float64)
# compute local contrast
contrast = (max-min)/(max+min)
# get average across whole image
average_contrast = 100*np.mean(contrast)
print(str(average_contrast)+"%")
17.481959221048086%
关于python - 如何提取照片的对比度-OpenCV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57256159/