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.

Другие вопросы по тегам