【问题标题】:Removing an overlay image from another image从另一个图像中删除覆盖图像
【发布时间】:2015-01-20 08:24:12
【问题描述】:

所以我有两张图片,一张是原始的,另一张应该是它上面的叠加层。叠加图像是半透明的,比如 alpha 为 0,5 的白色。

我可以用原件覆盖半透明的,但如何扭转这个过程?因此,在此代码示例中,如何仅使用“bld”和“fil”变量来获取“org”变量。有没有办法可以做到这一点?

import cv2

import numpy as np
import cv2

# Load a colored image and a filter
org = cv2.imread('original.png', cv2.CV_LOAD_IMAGE_UNCHANGED)
fil = cv2.imread('filter.png', cv2.CV_LOAD_IMAGE_UNCHANGED)

# Overlay the filter on the original image
bld = cv2.addWeighted(org,0.5,fil,0.5,0)

# Reverse the process?

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    好吧...用于线性混合bld = a*org + (1-a)*fil(在您的示例中为a = 0.5

    所以org = (bld - (1-a)*fil) / a

    如果我没记错的话是org = 1/a * bld + (1-1/a) * fil

    a = 0.5org = 2*bld -1*fil

    在代码中:

    a = 0.5
    org = cv2.addWeighted(bld,1/a,fil,1-1/a, 0)
    

    org = cv2.addWeighted(bld,2,fil,-1, 0)
    

    您也可以使用org = 2*bld - fil,但如果值超出例如,openCV 会截断这些值。 255 用于 8U 类型(称为 saturate_cast),因此如果您在计算前不转换为 16/32 位类型,这将不起作用。

    一般来说,如果您没有线性混合,则必须将第一个公式更改为 bld = a*org + b*fil 并从中计算其余部分。

    【讨论】:

    • 非常感谢您解释它的工作原理。这对我帮助很大!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多