繁体   English   中英

NumPy,PIL添加图像

[英]NumPy, PIL adding an image

我正在尝试使用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不支持的错误。

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

什么是实现我正在寻找的最佳方式?

源图像(图像已被删除):

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

嗯,好吧,我使用添加图片图标添加了源图像,当我正在编辑帖子时它们出现,但由于某种原因,图像没有显示在帖子中。

(图片已被删除)2013 05 09

正如大家所说的那样,你所观察到的怪异颜色是溢出的。 正如你在schnaader的回答评论中指出的那样,如果你添加这样的图像,你仍然会溢出

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注意 :你在MATLAB中没有看到这个问题的原因可能是因为MATLAB在其中一个函数中隐含地处理溢出。

使用PIL的blend(),其alpha值为0.5,相当于(im1arr + im2arr)/ 2。 Blend不要求图像具有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')

您发布的代码似乎只是总结了值,大于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和im2arr加在一起时,如果组件b1 + b2> 255,则会从一个通道溢出到下一个通道。 我猜测matlab将它们的图像表示为MxNx3阵列,因此每个颜色通道都是独立的。 您可以通过拆分PIL图像通道然后制作numpy数组来解决此问题

2)1 im1Arr是一个MxNx3字节数组,当你将im1arr和im2arr一起添加时,你将组件包裹起来。

在显示之前,您还必须将范围重新缩放到0-255之间。 您的选择除以2,缩放255 / array.max()或做一个剪辑。 我不知道matlab是做什么的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM