pil open from python image-processing numpy python-imaging-library

python - from - open image pil



NumPy, PIL agregando una imagen (5)

Como todo el mundo ya sugirió, los colores extraños que estás observando son desbordados. Y como usted señala en el comentario de la respuesta de schnaader, usted todavía obtiene desbordamiento si agrega sus imágenes de esta manera:

addition=(im1arr+im2arr)/2

La razón de este desbordamiento es que sus matrices NumPy ( im1arr im2arr ) son del tipo uint8 (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 de 255, regresa 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, las matrices deberían poder contener valores superiores a 255. Por ejemplo, debe convertirlos en flotantes , realizar la operación de fusión y convertir el resultado en uint8 :

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

No deberías hacer esto:

addition = im1arr/2 + im2arr/2

a medida que pierde información, aplastando la dinámica de la imagen (efectivamente hace que las imágenes sean 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 ocupa implícitamente del desbordamiento en una de sus funciones.

Intento agregar dos imágenes usando NumPy y PIL. La forma en que haría esto en MATLAB sería algo así como:

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

Obtengo algo como esto:

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

Usando un programa de composición y agregando las imágenes, el resultado de MATLAB parece ser el correcto.

En Python estoy tratando de hacer lo mismo así:

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 alternativo http://www.deadlink.cc/python.jpg

¿Por qué obtengo todos esos colores funky? También intenté usar ImageMath.eval("a+b", a=im1, b=im2) , pero recibí un error sobre RGB no admitido.

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

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

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

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

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

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


Para fijar valores de matriz numpy:

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


Parece que el código que ha publicado solo resume los valores y valores superiores a 256 que se desbordan. Desea algo como "(a + b) / 2" o "min (a + b, 256)". Esta última parece ser la forma en que lo hace tu ejemplo de Matlab.


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

No recuerdo exactamente cómo funciona la conversión de numpy a pil, pero hay dos casos probables. Estoy un 95% seguro de que es 1 pero estoy dando 2 en caso de que me equivoque. 1) 1 im1Arr es una matriz MxN de enteros (ARGB) y cuando se agregan 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, por lo que cada canal de color está separado. Puedes resolver esto dividiendo los canales de imagen PIL y luego haciendo matrices numpy

2) 1 im1Arr es una matriz de bytes MxNx3 y cuando se agregan im1arr e im2arr juntos, se está envolviendo el componente.

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


Usar la combinación de PIL () con un valor alfa de 0.5 sería equivalente a (im1arr + im2arr) / 2. La mezcla 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'')