2017-01-03 11 views
2

Попытка обработки необработанных изображений DNG в Python с rawpy заканчивается странными результатами.DNG необработанные изображения импортированы как 16 бит глубины, но неожиданные результаты plt.show()

import rawpy 
import imageio 
from matplotlib import pyplot as plt 

path = '/home/stefan/AIJ/RAW.DNG' 
with rawpy.imread(path) as raw: 
    rgb = raw.postprocess() 
plt.imshow(rgb) 
plt.show() 

В результате получается массив RGB изображения с 8-битовых значений, в то время как моя камера генерирует 14 бит необработанных изображений.

Визуализируя rgb массив дает ожидаемый результат:

enter image description here

С некоторого googleing я понял, что можно импортировать один и тот же файл, но с выходом в 16-бит.

Я использовал следующие параметры в функции постобработки:

rgb = raw.postprocess(output_bps=16,demosaic_algorithm=None,output_color = rawpy.ColorSpace.Adobe) 

Теперь rgb массив содержит 16-битные значения, но визуализация результатов в следующем:

enter image description here

Может кто-нибудь сказать мне, как Я мог бы получить визуализацию, подобную первому результату, но обрабатывая 16-битные значения?

Первоначально я думал, что это связано с тем, что моя камера производит 14-битные изображения, а не 16 бит, но изменение параметра output_bps на 14 дает еще худшие результаты визуализации.

Заранее благодарен!

По запросу я бы добавил здесь необработанную картинку из PENTAX K-5, но это 18MB большой, и форум имеет ограничение 2MB (может быть, еще один способ передать вам файл?).

+0

Можете ли вы поделиться своим необработанным файлом? Кажется маловероятным, чтобы нормальная камера выдавала DNG, который не нуждался в демонстрации ... или это не нормальная камера? –

+0

Почему ColorSpace.Adobe, если вы не применяете demosaicing? – Piglet

+0

Это то, что я попросил сам спонтанно, нужна ли этой картине демозапись? Но поскольку для output_bps = 8 бит выход в порядке, я не рассматривал. – noste99

ответ

1

Я не думаю, что проблема связана с тем, как вы читаете изображение, так как imshow не отображает 16-разрядные изображения RGB. Таким образом, если вы заинтересованы в визуальном контроле результатов чтения в 16-битное изображение, я хотел бы предложить либо проверки полос индивидуально, с

plt.imshow(rgb[:, :, 0]) 

и так далее для каждой группы; или преобразование rgb в 8-бит и отображение этого

rgb8 = (rgb/256).astype('uint8') 
plt.imshow(rgb8) 
+0

Большое спасибо jdmcbr! Я тщательно проверю ваше предложенное решение. Я просмотрел через веб-сайт, что модуль PyQtGraph способен визуализировать 16-битные изображения. Есть ли у кого-нибудь опыт работы с этим модулем? St – noste99

+0

Уважаемый JDMCBR, то, что вы предложили, отлично работает. Большое спасибо. Я смотрю в PyQtGraph, и это звучит многообещающе. – noste99

+0

Отлично, рад, что это помогло. Мой ограниченный опыт работы с «pyqtgraph» не побуждал меня использовать его вместо «matplotlib», но я надеюсь, что это сработает для вас. – jdmcbr