自动选择图像亮度的 Gamma 值

Auto selection of Gamma value for image brightness

我有一系列图像或实时视频,我想检查图像是更暗还是更亮,然后使用伽玛校正调整亮度,即图像 ^ 伽玛。 gamma = 1 什么都不做,小于 1 的 gamma 值会使图像变亮,大于 1 会使图像变暗。我必须给出不同类型的图像或视频的伽马值手册。

代码如下

lookUpTable = np.empty((1,256), np.uint8)
for i in range(256):
    lookUpTable[0,i] = np.clip(pow(i / 255.0, gamma) * 255.0, 0, 255)
res = cv2.LUT(image, lookUpTable)

我想在检查图像时自动查找伽马值。我试图使用直方图找到亮度的伽玛值,但它似乎不太好。

完整代码如下

        histr = cv2.calcHist([image],[0],None,[256],[0,256]) 
            
    totalPixels = image.shape[0]*image.shape[1]

    maxInd = np.argmax(histr) 
    maxVal = histr[maxInd]
    indP= int(0 if maxInd-5 < 0 else maxInd-5)
    indexN = int(maxVal+5)
    percentAtDark = (maxVal / totalPixels )*100
    darkSum = np.sum(histr[indP:indexN])
    percentDark = (darkSum / totalPixels )*100
    
    if (percentDark > dartThreshold) and (maxInd < 127): 
        gammaList = np.arange(0.01,0.9,0.02)
        gamma=gammaList[maxInd]
    else:
        gamma = 1
   
    lookUpTable = np.empty((1,256), np.uint8)
    for i in range(256):
        lookUpTable[0,i] = np.clip(pow(i / 255.0, gamma) * 255.0, 0, 255)
    res = cv2.LUT(image, lookUpTable)

dartThreshold 可以设置为 60 或 70。

伽玛校正可以看this page

末尾

任何人都可以在此代码中提出更好的方法或改进吗?欢迎提出任何建议。

在没有得到答案后,我试着找了一些东西来分享。可能是我没能问清楚问题。我按以下方式计算了伽马

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hue, sat, val = cv2.split(hsv)

mid = 0.5
mean = np.mean(val)
meanLog = math.log(mean)
midLog = math.log(mid*255)
gamma =midLog/meanLog
gamma = 1 / gamma

并将其应用于原始 BGR 图像

lookUpTable = np.empty((1,256), np.uint8)
for i in range(256):
    lookUpTable[0,i] = np.clip(pow(i / 255.0, gamma) * 255.0, 0, 255)
res = cv2.LUT(image, lookUpTable)

如果我们将 mid = 0.5 更改为 mid = 1,则伽马值会更改 0.1 即对于 mid = 0.5 如果我们得到 0.69 那么对于 mid = 1, 我们会得到 gamma = 0.59.

欢迎评论。