Вопрос

Я пытаюсь добавить два изображения вместе, используя Numpy и Pil. Как я бы сделал это в Матлаб было бы что -то вроде:

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

Я получаю что -то вроде этого:

Alt Text http://www.deadlink.cc/matlab.jpg

Использование программы композиции и добавление изображений, результат MATLAB кажется правильным.

В Python я пытаюсь сделать то же самое, как это:

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

И я получаю что -то вроде этого:

Alt Text http://www.deadlink.cc/python.jpg

Почему я получаю все эти причудливые цвета? Я также пытался использовать ImageMath.eval("a+b", a=im1, b=im2), но я получаю ошибку по поводу не поддержки RGB.

Я также видел, что есть Image.blend() Но это требует альфа.

Как лучше всего достичь того, что я ищу?

Изображения источников (изображения были удалены):

Alt Text http://www.deadlink.cc/_1.jpg Alt Text http://www.deadlink.cc/_2.jpg

Хум, хорошо, я добавил исходные изображения, используя значок «Добавить изображение», и они появляются, когда я редактирую сообщение, но по какой -то причине изображения не отображаются в посте.

(изображения были удалены) 2013 05 09

Это было полезно?

Решение

Как все уже предложили, странные цвета, которые вы наблюдаете, переполнены. И, как вы указываете в Комментарий ответа Шнаадера ты Все еще остановитесь Если вы добавите свои изображения как это:

addition=(im1arr+im2arr)/2

Причиной этого переполнения является то, что ваши массивы Numpy (im1arr im2arr) uint8 Тип (т.е. 8-битный). Это означает, что каждый элемент массива может содержать значения только до 255, поэтому, когда ваша сумма превышает 255, он возвращается около 0:

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

Чтобы избежать переполнения, ваши массивы должны иметь возможность содержать значения за пределами 255. Вам нужно преобразовать их в плавания Например, выполните операцию смешивания и преобразовать результат обратно в Uint8:

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

Ты не должна сделай это:

addition = im1arr/2 + im2arr/2

Когда вы теряете информацию, раздавливая динамику изображения (вы эффективно делаете изображения 7-бит), прежде чем выполнять информацию о смешивании.

Matlab Note: Причина, по которой вы не видите эту проблему в Matlab, вероятно, заключается в том, что Matlab неявно заботится о переполнении в одной из своих функций.

Другие советы

Использование PIL Blend () с альфа -значением 0,5 будет эквивалентно (im1arr + im2arr)/2. Смесь не требует, чтобы изображения имели альфа -слои.

Попробуй это:

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

Похоже, что код, который вы опубликовали, просто подводит итог значения и значения, более 256, переполнены. Вы хотите что -то вроде "(A + B) / 2" или "MIN (A + B, 256)". Последнее, кажется, так, как это делает ваш пример Matlab.

Чтобы закрепить значения массива Numpy:

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

Ваши образцы изображений не отображаются со мной, поэтому я собираюсь немного догадываться.

Я не могу точно вспомнить, как работает конверсия Numpy в PIL, но есть два вероятных случая. Я на 95% уверен, что это 1, но я даю 2 на случай, если я ошибаюсь. 1) 1 IM1ARR - это массив целых чисел MXN (ARGB), и когда вы добавляете IM1ARR и IM2AR, вы переполняете из одного канала в следующий, если компоненты B1+B2> 255. Я предполагаю, что Matlab представляет свои изображения в виде массивов MXNX3, поэтому каждый цветовой канал отделен. Вы можете решить это, разделяя каналы изображения PIL, а затем сделав массивы Numpy

2) 1 IM1ARR - это массив байтов MXNX3, и когда вы добавляете IM1ARR и IM2AR, вы обнимаете компонент вокруг.

Вам также придется отменить диапазон обратно до 0-255, прежде чем отображаться. Ваш выбор делится на 2, масштабируйте на 255/Array.max () или сделайте клип. Я не знаю, что делает Matlab

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top