如何解决自动选择图像亮度的 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,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,np.uint8)
for i in range(256):
lookUpTable[0,255)
res = cv2.LUT(image,lookUpTable)
dartThreshold 可以设置为 60 或 70。
对于伽马校正,您可以查看 this page
的末尾任何人都可以在此代码中提出更好的方法或改进吗?非常欢迎任何建议。
解决方法
在没有得到答复后,我尝试寻找一些可以分享的内容。可能是我没能问清楚。我按以下方式计算了 gamma
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,255)
res = cv2.LUT(image,lookUpTable)
如果我们将 mid = 0.5
更改为 mid = 1
,伽马值会改变 0.1
,即 mid = 0.5
如果我们得到 0.69
那么对于 {{1} },我们会得到mid = 1
。
欢迎评论。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。