Как реализовать настройку экспозиции, например Adobe Lightroom, с помощью OpenCV?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как реализовать настройку экспозиции, например Adobe Lightroom, с помощью OpenCV?

Сообщение Anonymous »

Я пытаюсь создать функции редактора изображений, подобные тем, которые предоставляет 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

Подробнее здесь: https://stackoverflow.com/questions/786 ... ing-opencv
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»