Вы были почти там, за исключением двух небольших ошибок.
Первая ошибка - использование 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)
Выход