python - 在不同尺寸的两幅图像中进行 Alpha 混合

标签 python opencv alphablending

解释了相同大小的两个图像中的 Alpha 混合 here 。我们如何对两个不同尺寸的图像实现这一点。例如:前景为 600x400 像素 PNG,背景为 700x380 像素 JPG。在提到的链接中,两个图像的大小相同。

foreground image background image

最佳答案

首先,调整大小不是一个好主意。除非两个图像一起调整大小(这不能解决问题),否则调整大小将以不期望的方式改变最终结果(例如,前景对象将显得比预期大)。

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

关于python - 在不同尺寸的两幅图像中进行 Alpha 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55953418/

相关文章:

opencv - 为什么我不能使用 FFMPEG 作为 OpenCV 的后端?

opengl - 如何让多边形抗锯齿工作?

c++ - 使用 Dlib 进行地标检测

c++ - 如何使用 GLSL 在体积渲染中进行混合?

javascript - 使用 html5 canvas 混合两个图像

Python pyCrypto RSA 加密方法使用私钥或公钥给出相同的结果

python - 使用 Python 清理 HTML 内容

python - 在 matplotlib 中禁用 imshow colorbar 的科学记数法

Python - oauth2 - linkedin API

python - 如何在需要时退出循环?