Question

J'essaie d'ajouter deux images ensemble en utilisant Numpy et PIL. La façon dont je ferais ça Matlab serait quelque chose comme:

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

J'ai quelque chose comme ça:

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

L'utilisation d'un programme de composition et l'ajout des images, le résultat MATLAB semble être correct.

Dans Python, j'essaie de faire la même chose comme ceci:

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

Et j'ai quelque chose comme ça:

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

Pourquoi ai-je toutes ces couleurs funky? J'ai aussi essayé d'utiliser ImageMath.eval("a+b", a=im1, b=im2), mais j'obtiens une erreur sur RVB non pris en charge.

J'ai aussi vu qu'il y a un Image.blend() Mais cela nécessite un alpha.

Quelle est la meilleure façon de réaliser ce que je recherche?

Images source (les images ont été supprimées):

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

Humm, ok, eh bien j'ai ajouté les images source à l'aide de l'icône Ajouter une image et elles apparaissent lorsque je modifie le post, mais pour une raison quelconque, les images n'apparaissent pas dans le post.

(Les images ont été supprimées) 2013 05 09

Était-ce utile?

La solution

Comme tout le monde l'a déjà suggéré, les couleurs étranges que vous observez sont débordées. Et comme vous le soulignez dans le Commentaire de la réponse de Schnaader tu Obtenez toujours un débordement Si vous ajoutez vos images comme ceci:

addition=(im1arr+im2arr)/2

La raison de ce débordement est que vos tableaux numpy (im1arr im2arr) sont du uint8 Type (c'est-à-dire 8 bits). Cela signifie que chaque élément du tableau ne peut contenir que des valeurs jusqu'à 255, donc lorsque votre somme dépasse 255, il en recule autour de 0:

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

Pour éviter le débordement, vos tableaux devraient pouvoir contenir des valeurs au-delà de 255. Vous devez les convertir en flotteurs Par exemple, effectuez l'opération de mélange et convertir le résultat en Uint8:

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

Tu ne devrait pas Faites ceci:

addition = im1arr/2 + im2arr/2

Lorsque vous perdez des informations, en écrasant la dynamique de l'image (vous faites efficacement les images 7 bits) avant d'effectuer les informations de mélange.

Note matlab: La raison pour laquelle vous ne voyez pas ce problème dans Matlab, est probablement parce que Matlab s'occupe du débordement implicitement dans l'une de ses fonctions.

Autres conseils

L'utilisation de Blend () de PIL avec une valeur alpha de 0,5 serait équivalente à (im1arr + im2arr) / 2. Blend ne nécessite pas que les images aient des couches alpha.

Essaye ça:

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

Il semble que le code que vous avez affiché résume les valeurs et les valeurs supérieures à 256 débordent. Vous voulez quelque chose comme "(a + b) / 2" ou "min (a + b, 256)". Ce dernier semble être la façon dont votre exemple MATLAB le fait.

Pour serrer les valeurs du tableau numpy:

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

Vos exemples d'images n'apparaissent pas de me former donc je vais faire un peu de devinettes.

Je ne me souviens pas exactement comment fonctionne la conversion Numpy to PIL, mais il y a deux cas probables. Je suis sûr à 95% qu'il est 1 mais je donne 2 au cas où je me trompe. 1) 1 im1arr est un tableau MXN d'entiers (argb) et lorsque vous ajoutez Im1arr et Im2arr ensemble, vous débordez d'un canal dans le suivant si les composants B1 + B2> 255. Je suppose que MATLAB représente leurs images sous forme de tableaux MXNX3, donc chaque canal de couleur est séparé. Vous pouvez résoudre ce problème en divisant les canaux d'image PIL, puis en fabriquant des tableaux Numpy

2) 1 IM1ArAr est un tableau MXNX3 d'octets et lorsque vous ajoutez IM1Ar et IM2ARR ensemble, vous enveloppez le composant.

Vous devrez également redimensionner la gamme entre 0-255 avant de s'afficher. Vos choix sont divisés par 2, échelle de 255 / array.max () ou faire un clip. Je ne sais pas ce que fait Matlab

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top