Отображение тона 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)
Выход