NumPy,PIL添加图像
image-processing
numpy
python
python-imaging-library
6
0

我正在尝试使用NumPy和PIL将两个图像添加在一起。我在MATLAB中执行此操作的方式将类似于:

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

我得到这样的东西:

替代文字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')

我得到这样的东西:

替代文字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

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

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

收藏
评论

使用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')
收藏
评论

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

收藏
评论

要钳制numpy数组值:

>>> c = a + b
>>> c[c > 256] = 256
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号