【问题标题】:How to set the best value for gamma correction如何设置伽马校正的最佳值
【发布时间】:2020-05-09 11:09:45
【问题描述】:

我正在尝试对图像使用伽马校正。但我只手动更改伽马校正值。有什么方法可以自动计算伽马校正的最佳值吗?例如。带亮度直方图。

代码:

# import the necessary packages
from __future__ import print_function
import numpy as np
import argparse
import cv2
def adjust_gamma(image, gamma=1.0):
    # build a lookup table mapping the pixel values [0, 255] to
    # their adjusted gamma values
    invGamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** invGamma) * 255
        for i in np.arange(0, 256)]).astype("uint8")
    # apply gamma correction using the lookup table
    return cv2.LUT(image, table)


# load the original image
original = cv2.imread('image.jpg')

# loop over various values of gamma
for gamma in np.arange(0.0, 3.5, 0.5):
    # ignore when gamma is 1 (there will be no change to the image)
    if gamma == 1:
        continue
    # apply gamma correction and show the images
    gamma = gamma if gamma > 0 else 0.1
    adjusted = adjust_gamma(original, gamma=gamma)
    cv2.putText(adjusted, "g={}".format(gamma), (10, 30),
        cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
    cv2.imshow("Images", np.hstack([original, adjusted]))
    cv2.waitKey(0)

【问题讨论】:

  • 你可以试试直方图均衡化(在每个通道上)

标签: python opencv


【解决方案1】:

在 Python/OpenCV 中有两种方法可以做到这一点。两者都基于对数(中灰色)/对数(平均值)的比率。结果通常是合理的,尤其是对于暗图像,但并非在所有情况下都有效。对于亮的图像,反转灰度或价值图像,处理暗图像,然后再次反转并重新组合,如果使用价值图像。

  • 读取输入
  • 转换为灰度或 HSV 值
  • 计算灰度或值通道上的比率 log(mid-gray)/log(mean)
  • 将输入或值提高到比率的幂
  • 如果使用值通道,请将新的值通道与色调和饱和度通道组合并转换回 RGB

输入:

import cv2
import numpy as np
import math

# read image
img = cv2.imread('lioncuddle1.jpg')

# METHOD 1: RGB

# convert img to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# compute gamma = log(mid*255)/log(mean)
mid = 0.5
mean = np.mean(gray)
gamma = math.log(mid*255)/math.log(mean)
print(gamma)

# do gamma correction
img_gamma1 = np.power(img, gamma).clip(0,255).astype(np.uint8)



# METHOD 2: HSV (or other color spaces)

# convert img to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hue, sat, val = cv2.split(hsv)

# compute gamma = log(mid*255)/log(mean)
mid = 0.5
mean = np.mean(val)
gamma = math.log(mid*255)/math.log(mean)
print(gamma)

# do gamma correction on value channel
val_gamma = np.power(val, gamma).clip(0,255).astype(np.uint8)

# combine new value channel with original hue and sat channels
hsv_gamma = cv2.merge([hue, sat, val_gamma])
img_gamma2 = cv2.cvtColor(hsv_gamma, cv2.COLOR_HSV2BGR)

# show results
cv2.imshow('input', img)
cv2.imshow('result1', img_gamma1)
cv2.imshow('result2', img_gamma2)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('lioncuddle1_gamma1.jpg', img_gamma1)
cv2.imwrite('lioncuddle1_gamma2.jpg', img_gamma2)


方法一的结果:

方法2的结果:

【讨论】:

  • 对于HSV情况,您可以通过hsv[:, :, 2]直接使用通道来避免拆分/合并
  • 在大图像上,最好创建一个查找表而不是每次都进行数学运算: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)`image_HSV[:, :, 2] = cv2.LUT(image_HSV[:, :, 2], lookUpTable)
  • 对于深色图像,这给了我更暗的图像。你不是忘了做 1/gamma 吗?
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2011-09-28
相关资源
最近更新 更多