我正在尝试使用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文本http://www.deadlink.cc/_2.jpg

嗯,好吧,好吧,我使用添加图像图标添加了源图像,它们在编辑帖子时会显示出来,但是由于某种原因,这些图像不会在帖子中显示。

(已删除图像)2013 05 09

有帮助吗?

解决方案

正如每个人都建议的那样,您观察到的怪异颜色是溢出的。正如你在 Schnaader回答的评论仍然溢出 如果您添加这样的图像:

addition=(im1arr+im2arr)/2

此溢出的原因是您的numpy数组(im1arr IM2arrUINT8 类型(即8位)。这意味着数组的每个元素只能保持高达255的值,因此,当您的总和超过255时,它会在0:返回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在其功能之一中隐含地照顾了溢出。

其他提示

使用alpha值为0.5的PIL Blend()等效于(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个大于256的值。您想要“(A + B) / 2”或“ Min(A + B,256)”之类的东西。后者似乎是您的MATLAB示例这样做的方式。

要夹住numpy数组值:

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

您的示例图像没有显示出我的形式,所以我会做一些猜测。

我不记得确切的numpy转换是如何工作的,但是有两种可能的情况。我95%肯定是1,但是给2个,以防万一我错了。 1)1 IM1ARR是整数的MXN数组(ARGB),当您将IM1ARR和IM2ARR添加在一起时,如果组件B1+B2> 255,则从一个通道中溢出到下一个通道。我猜MATLAB将其图像表示为MXNX3阵列,因此每个颜色通道都是分开的。您可以通过拆分PIS图像通道然后制作Numpy阵列来解决此问题

2)1 IM1ARR是一个字节的MXNX3数组,当您将IM1ARR和IM2ARR添加在一起时,您会将组件包裹起来。

在显示之前,您还必须将范围恢复到0-255之间。您的选择除以2,比例比255/array.max()或执行剪辑。我不知道Matlab做什么

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top