Alpha以不同大小混合两个图像

时间:2019-05-02 13:19:19

标签: python opencv alphablending

here中说明了以相同大小的Alpha混合两个图像。我们如何针对两个不同大小的图像实现此功能。例如:前景为600x400像素PNG,背景为700x380像素JPG。在提到的链接中,两个图像的大小相同。

foreground image background image

1 个答案:

答案 0 :(得分:3)

首先,调整大小是个坏主意。除非同时调整两个图像的大小(这不能解决问题),否则调整大小将以不希望的方式更改最终结果(例如,前景对象看起来比预期的要大)。

Alpha混合通常用于将前景元素添加到背景图像中。因此,我将固定背景图像的大小,并考虑它也是输出图像的大小。在应用程序中,可能需要让前景退出背景图像,但这是一种特定的应用程序,需要更多输入(如何扩展背景边框?)。

由于背景图像的大小固定,我们需要一种方法来处理较小图像的Alpha混合。考虑简化的情况,在点(0,0),较小的(前景)图像与较大的(背景)图像对齐。然后,您可以遍历背景图像,检查它是否与前景图像重叠,如果重叠,则将它们融合。

解决一般情况会带来另一个问题:定位。您需要知道在哪里放置前景元素。这需要一些额外的输入。

给出较小的图像和要放置的位置,可以使用以下算法对较大的图像进行alpha混合:

let posx and posy be the placement position of the foreground image
let foreground.sizex and foreground.sizey the size of the foreground image
for each row of the background image
    for each column of the background image
        // check if the position overlaps the foreground image
        if column - posx >= 0 and column - posx < foreground.sizex
            if row - posy >= 0 and row - posy < foreground.sizey
                 alpha blend the background and the foreground
        else
            output background value

请注意,减去前景图像的放置位置基本上就是平移。

为了直观地展示这个想法,获得输出

enter image description here

,您可以认为图像大小相同并检查是否重叠。如果它们重叠,则混合。如果没有,请保留背景。这将导致以下情况(添加黑色边框以显示较小的前景图像):

enter image description here

如果您不希望将前景图像放置在左上角,只需对其进行翻译。 posxposy代表应用于前景图像的转换,即红点的坐标:

enter image description here