【问题标题】:Alpha blending in different size two images阿尔法混合不同大小的两个图像
【发布时间】:2019-05-02 13:19:18
【问题描述】:

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

【问题讨论】:

  • 通过在较小的一张中添加填充或裁剪较大的一张,使两张图片大小相同。
  • 您需要添加您已经尝试过的代码示例并提供更多详细信息;看看怎么写MCVE
  • 谢谢@ShubhankarMohan 我有这个想法。没有更好的方法吗?我们也可以为较大的添加填充,使较小的宽高比​​相同,然后将较小的调整为相同的大小。这种方法对于实时处理会更好。您可以使用 imutils 包来调整大小,同时保持纵横比相同。只是分享知识。 :)
  • 这个例子在我提到的链接上。
  • 请展示您想要混合的代表性图像。

标签: python opencv alphablending


【解决方案1】:

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

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

注意,前景图放置位置的减法基本是平移。

直观地展示这个想法,得到输出

,您可以将其视为图像大小相同并检查重叠。如果它们重叠,则混合。如果他们不这样做,请保留背景。这将导致类似这样的结果(添加黑色边框以显示较小的前景图像):

如果您不想将前景图像放在左上角,只需将其平移即可。 posxposy 表示应用于前景图像的平移,即红点的坐标:

【讨论】:

  • 是的,算法看起来很干净,应该可以工作。做得好!谢谢你。我能知道你所说的posxposy 到底是什么意思吗?如果您可以使用给定的图像编辑您的答案。这将是最好的帮助。再次感谢你!欢呼
  • 添加了更多(视觉)解释。
  • 能否添加示例代码。我明白你解释的意思。干杯! @Pual92
  • 你能把你的算法应用到给定的图像上吗?这将是一个很大的帮助,因为我正在从事我的 uni 项目并且截止日期很近。谢谢你。 @Paul92
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2021-10-26
  • 2012-01-22
  • 2012-04-12
相关资源
最近更新 更多