Отображение тона HDR-изображения с помощью OpenCV 4.0

Я хочу создать скрипт, который принимает .HDR файл и звуковые карты это в .JPG, Я посмотрел несколько учебных пособий по OpenCV, и, похоже, он сможет это сделать.

Я написал этот сценарий:

import cv2
import numpy as np

filename = "image/gg.hdr"
im = cv2.imread(filename)

cv2.imshow('', im.astype(np.uint8))
cv2.waitKey(0)

tonemapDurand = cv2.createTonemapDurand(2.2)
ldrDurand = tonemapDurand.process(im.copy())

new_filename = filename + ".jpg"
im2_8bit = np.clip(ldrDurand * 255, 0, 255).astype('uint8')
cv2.imwrite(new_filename, ldrDurand)

cv2.imshow('', ldrDurand.astype(np.uint8))

Который в соответствии с учебниками должен работать. Я получаю черное изображение в конце концов, хотя. Я убедился, что результат, который он сохраняет, .JPG, а также то, что входное изображение (карта среды HDR 1,6 мегапикселя) является действительным .HDR,

OpenCV должен быть в состоянии загрузить .HDRс согласно документации.

Я попытался воспроизвести учебник, связанный, и он работал правильно, поэтому проблема в .HDR Имидж, кто-нибудь знает, что делать?

Спасибо

РЕДАКТИРОВАТЬ: я использовал это изображение HDR. Предоставление ссылки, а не прямой загрузки из-за авторских прав и т. Д.

1 ответ

Решение

Вы были почти там, за исключением двух маленьких ошибок.

Первая ошибка заключается в использовании cv2.imreadзагрузить изображение HDR без указания каких-либо флагов. Если вы не называете это с IMREAD_ANYDEPTH данные будут уменьшены до 8 бит, и вы потеряете весь этот высокий динамический диапазон.

Когда вы укажете IMREAD_ANYDEPTH, изображение будет загружено как 32-битный формат с плавающей точкой. Обычно это имеет интенсивность в диапазоне [0,0, 1,0], но из-за HDR значения превышают 1,0 (в данном конкретном случае они достигают примерно 22). Это означает, что вы не сможете визуализировать это (полезным способом), просто приведя данные к np.uint8, Возможно, вы могли бы сначала нормализовать его в номинальном диапазоне или использовать метод масштабирования и обрезки... все, что вы считаете подходящим Поскольку ранняя визуализация не имеет отношения к результату, я пропущу это.

Второй вопрос тривиален. Вы правильно масштабируете и обрезаете тональное изображение обратно в np.uint8, но тогда вы никогда не используете его.


скрипт

import cv2
import numpy as np

filename = "GoldenGate_2k.hdr"
im = cv2.imread(filename, cv2.IMREAD_ANYDEPTH)

tonemapDurand = cv2.createTonemapDurand(2.2)
ldrDurand = tonemapDurand.process(im)

im2_8bit = np.clip(ldrDurand * 255, 0, 255).astype('uint8')

new_filename = filename + ".jpg"
cv2.imwrite(new_filename, im2_8bit)

Выход

Другие вопросы по тегам