NumPy,PIL添加imag

2024-09-28 03:20:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用NumPy和PIL将两个图像添加到一起。我在MATLAB中这样做的方式如下:

>> 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 unsupported的错误。

我还看到有一个Image.blend(),但这需要一个alpha。

实现我所追求的目标的最佳方法是什么?

源映像(已删除映像):

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

嗯,好吧,我用“添加图像”图标添加了源图像,它们在我编辑文章时会出现,但由于某些原因,这些图像不会出现在文章中。

(图像已删除)2013 05 09


Tags: text图像imagehttppilwwwaltusers
3条回答

要钳制numpy数组值:

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

使用alpha值为0.5的PIL's blend()相当于(im1arr+im2arr)/2。混合不要求图像具有alpha层。

试试这个:

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

正如大家已经建议的那样,你观察到的奇怪的颜色已经泛滥了。正如您在comment of schnaader's answer中指出的,如果您像这样添加图像,则仍会出现溢出:

addition=(im1arr+im2arr)/2

溢出的原因是NumPy数组(im1arrim2arr)属于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注意:您在MATLAB中没有看到这个问题的原因,可能是因为MATLAB隐式地处理了它的一个函数中的溢出。

相关问题 更多 >

    热门问题