自动选择图像亮度的Gamma值



我有一系列图像或实时视频,我想检查图像是暗还是亮,然后使用伽马校正调整亮度,即image ^ gamma。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。

有关伽马校正,请查看本页末尾

谁能提出更好的方法或改进这段代码?欢迎提出任何建议。

在没有得到答案后,我试图找到一些东西来分享。可能是我没有把问题问清楚。我用下面的方法计算了

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

欢迎留言

最新更新