Отображение тона HDR-изображения с помощью OpenCV 4.0 - PullRequest
0 голосов
/ 12 февраля 2019

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

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

Спасибо

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

1 Ответ

0 голосов
/ 13 февраля 2019

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

Первая ошибка - использование 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)

Выход

Sample Output

...