Я пытаюсь создать функции редактора изображений, подобные тем, которые предоставляет Adobe Lightroom, с Python и OpenCV. Одним из них является регулировка экспозиции на изображении. Проблема, с которой я всегда сталкиваюсь, заключается в том, что после увеличения экспозиции откорректированное изображение приобретает желтоватый или оранжевоватый оттенок. Я ищу, в чем причина этого желтоватого/оранжевого оттенка. Это из-за неравномерной настройки каналов RGB. Могу ли я узнать, в чем реальная причина и как я могу решить эту проблему?
Итак, чтобы отрегулировать экспозицию, я попробовал несколько подходов. Я ожидаю отрегулировать экспозицию входного изображения как можно ближе к настройке с помощью 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
Степень воздействия выходного результата равна 2
Я пытаюсь использовать 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
Увеличение степени экспозиции на 2 для цветового канала HSV
Я пытаюсь создать функции редактора изображений, подобные тем, которые предоставляет Adobe Lightroom, с Python и OpenCV. Одним из них является регулировка экспозиции на изображении. Проблема, с которой я всегда сталкиваюсь, заключается в том, что после увеличения экспозиции откорректированное изображение приобретает желтоватый или оранжевоватый оттенок. Я ищу, в чем причина этого желтоватого/оранжевого оттенка. Это из-за неравномерной настройки каналов RGB. Могу ли я узнать, в чем реальная причина и как я могу решить эту проблему? Итак, чтобы отрегулировать экспозицию, я попробовал несколько подходов. Я ожидаю отрегулировать экспозицию входного изображения как можно ближе к настройке с помощью Adobe Lightroom. Это изображение, которое я использую в качестве входных данных, и это ожидаемый результат изображения из Adobe Lightroom. со значением экспозиции 3,67 [list] [*]Использование гамма-коррекции, поскольку я читал, что изображение RAW, снятое с камеры, обычно корректируется при отображении на мониторе. Я думаю, что одна из основных причин заключается в том, что наши человеческие глаза не воспринимают свет линейно. И это результат настройки гаммы в этой реализации кода. [/list] [code]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 [/code] Это результат гамма-коррекции [list] [*]Я пытаюсь увеличить экспозицию, применив степень 2 на каждый пиксель. Но даже несмотря на то, что яркость света увеличивается, на лицах появляется желтоватый/оранжевый оттенок. Это не идеально, поскольку увеличение экспозиции в Adobe Lightroom не вызывало этой проблемы. [/list] [code]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 [/code] Степень воздействия выходного результата равна 2 [list] [*]Я пытаюсь использовать HSV, потому что читаю, если Я хочу сосредоточиться только на яркости, не затрагивая цветовой оттенок, тогда я смогу отрегулировать V в HSV. Но после того, как я увеличиваю его, результат становится более близким к тому, что я хочу, например Adobe Lightroom. [/list] [code]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 [/code] Увеличение степени экспозиции на 2 для цветового канала HSV
Я пытаюсь создать функции редактора изображений, подобные тем, которые предоставляет Adobe Lightroom, с Python и OpenCV. Одним из них является регулировка экспозиции на изображении. Проблема, с которой я всегда сталкиваюсь, заключается в том, что...
Когда я вызываю метод cvSetCaptureProperty(capture, CV_CAP_PROP_EXPOSURE, 2);, он устанавливает экспозицию камеры так, как должно. Однако, когда я запускаю программное обеспечение Dell Webcam Central, Skype или что-либо еще, использующее мою камеру,...