RAW Обработка изображений в Python
Существуют ли какие-либо решения Pythonic для чтения и обработки изображений RAW. Даже если он просто обращается к необработанному файлу фотографии (например, cr2 или dng), а затем выводит его в формате JPEG.
В идеале привязки dcraw для python, но все, что может выполнить поставку, также будет достаточно.
6 ответов
Некоторое время назад я написал оболочку libraw/dcraw под названием rawpy. Это довольно легко использовать:
import rawpy
import imageio
raw = rawpy.imread('image.nef')
rgb = raw.postprocess()
imageio.imsave('default.tiff', rgb)
Он изначально работает с массивными массивами и поддерживает множество опций, включая прямой доступ к необработанным данным Байера.
ImageMagick поддерживает большинство форматов RAW и обеспечивает привязки Python.
Что касается привязок dcraw для Python: dcraw написан на C, так что вы можете получить к нему доступ через ctypes
модуль.
Вот способ преобразования изображения canon CR2 в дружественный формат с помощью rawkit, который работает с его текущей реализацией:
import numpy as np
from PIL import Image
from rawkit.raw import Raw
filename = '/path/to/your/image.cr2'
raw_image = Raw(filename)
buffered_image = np.array(raw_image.to_buffer())
image = Image.frombytes('RGB', (raw_image.metadata.width, raw_image.metadata.height), buffered_image)
image.save('/path/to/your/new/image.png', format='png')
Использование массива numpy здесь не очень элегантно, но, по крайней мере, оно работает, я не мог понять, как использовать конструкторы PIL для достижения того же.
Я недавно написал библиотеку на чистом Python rawphoto
для обработки необработанных изображений в Python. В настоящее время он поддерживает только файлы Canon CR2 (надеюсь, скоро я добавлю форматы Nikon). Это также на PyPi. Это может быть полезно для вас, если вы обращаетесь к файлам CR2.
Пример извлечения предварительного изображения JPEG:
from rawphoto.cr2 import Cr2
blob = Cr2(filename="somefile.CR2").get_quarter_size_rgb()
# Do something with the JPEG here... eg. save it:
with open("output.jpeg", 'wb' as f:
f.write(blob)
или, используя общий Raw
класс, который обернет любой тип необработанного файла, когда я добавлю больше:
from rawphoto.raw import Raw
# The API here will probably change before the 1.0 release.
blob = Raw(filename="somefile.CR2").fhandle.get_quarter_size_rgb()
# Do something with the JPEG here... eg. save it:
with open("output.jpeg", 'wb' as f:
f.write(blob)
РЕДАКТИРОВАТЬ: Это было заменено rawkit, привязки libraw на основе ctypes. RawKit будет работать намного лучше, и вы должны использовать его вместо этого (теперь rawphoto устарела и будет использоваться только в качестве учебного пособия).
Попробуйте http://libopenraw.freedesktop.org/wiki/GettingTheCode
Git-репозиторий: git://anongit.freedesktop.org/git/libopenraw.git
В дереве исходного кода есть каталог python.;-)
Я не уверен, насколько обширна поддержка RAW в Python Imaging Library (PIL http://www.pythonware.com/products/pil/), но вы можете проверить это.
В противном случае вы можете просто вызвать dcraw напрямую, так как это уже хорошо решает эту проблему.
Я нашел это: https://gitorious.org/dcraw-thumbnailer/mainline/blobs/master/dcraw-thumbnailer
Он вызывает dcraw как процесс из python и преобразует его в объект PIL.