如何使用python或matlab将多个图像叠加在一起?

时间:2016-02-16 08:32:22

标签: python image matlab

如何使用python(或matlab)堆叠多个图像并保存新的输出图像? 我需要设置每个图像的alpha并进行一点翻译,例如:

enter image description here

2 个答案:

答案 0 :(得分:4)

这是基于我的评论的一个例子:

EEE, dd MMM yyyy HH:mm:ss ZZZ (zzz)

enter image description here

答案 1 :(得分:1)

您可以使用numpymatplotlib模块使用Python制作这样一堆翻译(移位)图像。 Pillow(另一个Python模块)本身也可以这样做,但我必须查找如何确保重叠像素的值被添加,而不是被覆盖。

所以,这是一个numpy + matplotlib解决方案,它以测试图像开始:

layers = 5  # How many images should be stacked.
x_offset, y_offset = 40, 20  # Number of pixels to offset each image.

new_shape = ((layers - 1)*y_offset + img1.shape[0],
             (layers - 1)*x_offset + img1.shape[1],
             4)  # the last number, i.e. 4, refers to the 4 different channels, being RGB + alpha

stacked = np.zeros(new_shape, dtype=np.float)


for layer in range(layers):
    stacked[layer*y_offset:layer*y_offset + img1.shape[0],
            layer*x_offset:layer*x_offset + img1.shape[1], 
            ...] += img1*1./layers
plt.imsave('stacked.png', stacked, vmin=0, vmax=1)

对于接下来的人来说,本文末尾会显示一个非常简单的测试图像,这也将用于显示可用于堆叠的不同选项(覆盖或加权,加权不透明度等权重)。

+=

它真的非常简单:你预先计算输出图像的大小,将其初始化为完全透明,然后你就可以放弃"删除"该文件中的基本图像,每次偏移某个偏移矢量。部件重叠时会出现有趣的部分。然后你有一些选择:

  • 覆盖之前的内容。在这种情况下,请将=运算符更改为vmin。另外,不要按层数进行缩放。
  • 以加权方式添加。您应该将每个通道中的所有强度值重新调整一定的权重(在上面的示例中采用相同的重要性),然后添加这些值。这可能,取决于a.o.在权重上,你使像素饱和。您可以选择剪切数组(从而导致信息丢失),或者只是按照新获得的最大值重新调整所有内容。上面的示例通过在vmax调用中指定imsave和{{1}}来使用裁剪。

此处显示的测试图像包含4个透明方块,但这些方块与左上方的2个白色方块不易区分。添加它们是为了说明透明度的增加和重新缩放的效果(白色变成灰色)。

enter image description here

运行上面的代码后,你最终会得到类似的东西(虽然改变你的偏移)("添加") enter image description here 或者像这样("覆盖") enter image description here

您可以考虑更多的方法来反映像素重叠时您想要做的事情。这里的两种情况可能是最常见的情况。无论如何,这里提出的方法应该会给你一个良好的开端。