您发布的代码似乎只是汇总了值,并且大于256的值正在溢出。您需要“(a + b)/ 2”或“ min(a + b,256)”之类的东西。后者似乎是您的Matlab示例执行此操作的方式。

NumPy,PIL添加图像

共 4 个回答
高赞
时间
活跃
0

0

使用alpha值为0.5的PIL的blend()等效于(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')
0

正如每个人都已经建议的那样,您正在观察的怪异颜色溢出了。正如您在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在其函数之一中隐式地处理了溢出问题。
0

要钳制numpy数组值:
>>> c = a + b
>>> c[c > 256] = 256
新手导航
- 社区规范
- 提出问题
- 进行投票
- 个人资料
- 优化问题
- 回答问题
0
我正在尝试使用NumPy和PIL将两个图像添加在一起。我在MATLAB中执行此操作的方式将类似于:
我得到这样的东西:
替代文字http://www.deadlink.cc/matlab.jpg
使用合成程序并添加图像,MATLAB结果似乎是正确的。
在Python中,我试图做同样的事情:
我得到这样的东西:
替代文字http://www.deadlink.cc/python.jpg
为什么我得到所有这些时髦的颜色?我也尝试使用
ImageMath.eval("a+b", a=im1, b=im2)
,但是出现关于RGB不支持的错误。我还看到有一个
Image.blend()
但是需要一个alpha。实现我所寻找的最佳方法是什么?
源图像(图像已删除):
替代文字http://www.deadlink.cc/_1.jpg 替代文字http://www.deadlink.cc/_2.jpg
嗯,好吧,好吧,我使用添加图像图标添加了源图像,当我编辑帖子时它们会显示出来,但是由于某些原因,这些图像没有显示在帖子中。
(图像已删除)2013 05 09