Итак, чтобы отрегулировать экспозицию, я попробовал несколько подходов. Я ожидаю отрегулировать экспозицию входного изображения как можно ближе к настройке с помощью Adobe Lightroom.
Это изображение, которое я использую в качестве входных данных, и это ожидаемый результат изображения из Adobe Lightroom. со значением экспозиции 3,67
- Использование гамма-коррекции, поскольку я читал, что изображение RAW, снятое с камеры, обычно корректируется при отображении на мониторе. Я думаю, что одна из основных причин заключается в том, что наши человеческие глаза не воспринимают свет линейно. И это результат настройки гаммы в этой реализации кода.
Код: Выделить всё
def adjust_gamma_original(image, gamma=1.0):
inv_gamma = 1.0 / gamma
table = np.array([((i / 255.0) ** inv_gamma) * 255 for i in np.arange(0, 256)]).astype("uint8")
adjusted_image = cv2.LUT(image, table)
return adjusted_image
- Я пытаюсь увеличить экспозицию, применив степень 2 на каждый пиксель. Но даже несмотря на то, что яркость света увеличивается, на лицах появляется желтоватый/оранжевый оттенок. Это не идеально, поскольку увеличение экспозиции в Adobe Lightroom не вызывало этой проблемы.
Код: Выделить всё
def apply_exposure_compensation(image, exposure_factor):
"""
Apply exposure compensation to an image.
:param image: Input image.
:param exposure_factor: Factor to adjust exposure. Positive values increase exposure, negative values decrease exposure.
:return: Image with adjusted exposure.
"""
# Convert the image to float for precision
image_float = img_as_float(image)
# Adjust exposure by multiplying the image with the exposure factor
adjusted_image = image_float * (2 ** exposure_factor)
# Clip values to stay within valid range [0, 1] and convert back to uint8
adjusted_image = np.clip(adjusted_image, 0, 1)
adjusted_image = img_as_ubyte(adjusted_image)
return adjusted_image
- Я пытаюсь использовать HSV, потому что читаю, если Я хочу сосредоточиться только на яркости, не затрагивая цветовой оттенок, тогда я смогу отрегулировать V в HSV. Но после того, как я увеличиваю его, результат становится более близким к тому, что я хочу, например Adobe Lightroom.
Код: Выделить всё
def apply_exposure_compensation_hsv(image, exposure_factor):
"""
Apply exposure compensation to an image by adjusting the brightness in the HSV color space.
:param image: Input image.
:param exposure_factor: Factor to adjust exposure. Positive values increase exposure, negative values decrease exposure.
:return: Image with adjusted exposure.
"""
# Convert the image to HSV color space
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV).astype(np.float32)
# Adjust the V (brightness) channel
h, s, v = cv2.split(hsv)
v = v * (2 ** exposure_factor)
v = np.clip(v, 0, 255)
# Merge the channels back
hsv_adjusted = cv2.merge([h, s, v]).astype(np.uint8)
# Convert back to BGR color space
adjusted_image = cv2.cvtColor(hsv_adjusted, cv2.COLOR_HSV2BGR)
return adjusted_image
Подробнее здесь: https://stackoverflow.com/questions/786 ... ing-opencv