Pregunta

Estoy tratando de agregar dos imágenes juntas usando Numpy y PIL. La forma en que haría esto en Matlab sería algo como:

>> M1 = imread('_1.jpg');
>> M2 = imread('_2.jpg');
>> resM = M1 + M2;
>> imwrite(resM, 'res.jpg');

Entiendo algo como esto:

texto alt http://www.deadlink.cc/matlab.jpg

Usar un programa de composición y agregar las imágenes el resultado de MATLAB parece ser correcto.

En Python estoy tratando de hacer lo mismo como esto:

from PIL import Image
from numpy import *

im1 = Image.open('/Users/rem7/Desktop/_1.jpg')
im2 = Image.open('/Users/rem7/Desktop/_2.jpg')

im1arr = asarray(im1)
im2arr = asarray(im2)

addition = im1arr + im2arr

resultImage = Image.fromarray(addition)
resultImage.save('/Users/rem7/Desktop/a.jpg')

Y obtengo algo como esto:

texto alt http://www.deadlink.cc/python.jpg

¿Por qué recibo todos esos colores funky? También intenté usar ImageMath.eval("a+b", a=im1, b=im2), pero recibo un error sobre RGB sin apoyo.

También vi que hay un Image.blend() Pero eso requiere un alfa.

¿Cuál es la mejor manera de lograr lo que estoy buscando?

Imágenes de origen (se han eliminado las imágenes):

texto alt http://www.deadlink.cc/_1.jpg texto alt http://www.deadlink.cc/_2.jpg

Humm, OK, bueno, agregué las imágenes de origen usando el icono Agregar imagen y se muestran cuando estoy editando la publicación, pero por alguna razón las imágenes no aparecen en la publicación.

(Se han eliminado las imágenes) 2013 05 09

¿Fue útil?

Solución

Como todos sugirieron ya, los colores extraños que estás observando son desbordados. Y como señala en el Comentario de la respuesta de SchnaaderTodavía ponte desbordado Si agrega sus imágenes como esta:

addition=(im1arr+im2arr)/2

La razón de este desbordamiento es que sus matrices numpy (im1arr im2arr) son de la uint8 Tipo (es decir, 8 bits). Esto significa que cada elemento de la matriz solo puede contener valores de hasta 255, por lo que cuando su suma excede 255, se retrocede alrededor de 0:

>>>array([255,10,100],dtype='uint8') +  array([1,10,160],dtype='uint8')
array([ 0, 20,  4], dtype=uint8)

Para evitar el desbordamiento, sus matrices deben poder contener valores más allá de 255. Necesita conviértalos en flotadores Por ejemplo, realice la operación de mezcla y convertir el resultado de regreso a uint8:

im1arrF = im1arr.astype('float')
im2arrF = im2arr.astype('float')
additionF = (im1arrF+im2arrF)/2
addition = additionF.astype('uint8')

no debe hacer esto:

addition = im1arr/2 + im2arr/2

A medida que pierde información, aplastando la dinámica de la imagen (efectivamente hace las imágenes de 7 bits) antes de realizar la información de mezcla.

Nota de matlab: La razón por la que no ve este problema en Matlab es probablemente porque Matlab se encarga del desbordamiento implícitamente en una de sus funciones.

Otros consejos

Usar la mezcla de PIL () con un valor alfa de 0.5 sería equivalente a (IM1ARR + IM2ARR)/2. Blend no requiere que las imágenes tengan capas alfa.

Prueba esto:

from PIL import Image
im1 = Image.open('/Users/rem7/Desktop/_1.jpg')
im2 = Image.open('/Users/rem7/Desktop/_2.jpg')
Image.blend(im1,im2,0.5).save('/Users/rem7/Desktop/a.jpg')

Parece que el código que publicó solo resume los valores y valores mayores que 256 se están desbordando. Quieres algo como "(A + B) / 2" o "Min (A + B, 256)". Este último parece ser la forma en que su ejemplo de Matlab lo hace.

Para sujetar valores de matriz numpy:

>>> c = a + b
>>> c[c > 256] = 256

Sus imágenes de muestra no se muestran de mí, así que voy a hacer un poco de adivinanza.

No puedo recordar exactamente cómo funciona la conversión Numpy to PIL, pero hay dos casos probables. Estoy 95% seguro de que es 1, pero estoy dando 2 por si me equivoco. 1) 1 IM1ARR es una matriz mxn de enteros (argb) y cuando agrega IM1ARR e IM2ARR juntos, se está desbordando de un canal al siguiente si los componentes B1+B2> 255. Supongo que Matlab representa sus imágenes como matrices MXNX3 para que cada canal de color esté separado. Puede resolver esto dividiendo los canales de imagen PIL y luego haciendo matrices numpy

2) 1 IM1ARR es una matriz MXNX3 de bytes y cuando agrega IM1ARR e IM2ARR juntos, está envolviendo el componente.

También tendrá que rescalar el rango de regreso a entre 0-255 antes de mostrar. Sus opciones se dividen por 2, escala por 255/array.max () o hacen un clip. No se lo que hace Matlab

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top