2010-03-11 48 views
30

¿Hay alguna solución Pythonic para leer y procesar imágenes RAW. Incluso si es simplemente acceder a un archivo de foto sin formato (por ejemplo, cr2 o dng) y luego emitirlo como un jpeg.Procesamiento de imágenes RAW en Python

Lo ideal sería una dcraw bindings para python, pero cualquier otra cosa que pueda lograr el vino sería suficiente también.

Respuesta

0

No estoy seguro de cuán extenso es el soporte RAW en Python Imaging Library (PIL http://www.pythonware.com/products/pil/), pero es posible que desee verificarlo.

De lo contrario, puede llamar a dcraw directamente ya que ya resuelve este problema muy bien.

+0

PIL no hace RAW (al menos, no CR2 o DCR). – Seth

4

Escribí una biblioteca pure-python recientemente llamada rawphoto para procesar imágenes en bruto en python. Actualmente solo es compatible con los archivos Canon CR2 (próximamente agregaré formatos Nikon). También está en PyPi. Puede ser útil para usted si está accediendo a archivos CR2.

Ejemplo de extraer el JPEG previsualización de la imagen:

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) 

o, utilizando la clase genérica Raw que envolver cualquier tipo de archivo en bruto como añado más:

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) 

EDITAR: Esto ha sido reemplazado por rawkit, enlaces de libraw basados ​​en ctypes. RawKit funcionará mucho mejor y deberías usarlo en su lugar (rawphoto ahora va a estar en desuso y solo se usa como una herramienta educativa).

+0

Este código no funciona para mí. Instalé el paquete pero obtengo el error: AttributeError: el objeto 'Cr2' no tiene atributo 'get_quarter_size_rgb' – Jonny

+0

Las API han cambiado desde que escribí esta respuesta. Compruebe el código en la clase Cr2 (o mire la clase más general, 'Raw'). –

+0

Quizás puedas actualizar la respuesta entonces? – Jonny

10

Hace un tiempo escribí un contenedor libraw/dcraw llamado rawpy. Es muy fácil de usar:

import rawpy 
import imageio 

raw = rawpy.imread('image.nef') 
rgb = raw.postprocess() 
imageio.imsave('default.tiff', rgb) 

que funciona de forma nativa con matrices numpy y es compatible con una gran cantidad de opciones, incluyendo el acceso directo a los datos sin procesar de Bayer.

2

Aquí es una forma de convertir una imagen de Canon CR2 a un formato amigable con rawkit, que funciona con su implementación actual:

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') 

Usando una matriz numpy no es muy elegante aquí, pero al menos funciona, No pude entender cómo usar constructores PIL para lograr lo mismo.

+0

Está guardando el formato jpeg en un archivo con extensión png. –

+0

Gracias, corrigió el error tipográfico. –

Cuestiones relacionadas