Python 从其他图像中删除覆盖图像

Python 从其他图像中删除覆盖图像,python,opencv,Python,Opencv,所以我有两张图片,一张是原始的,另一张是覆盖在上面的。叠加图像是半透明的,比如说,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',

所以我有两张图片,一张是原始的,另一张是覆盖在上面的。叠加图像是半透明的,比如说,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?

嗯。。。对于线性混合
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.5
org=2*bld-1*fil

代码:

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

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


一般来说,如果你没有线性混合,你必须将第一个公式改为bld=a*org+b*fil,然后从中计算剩余的。。。对于线性混合
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.5
org=2*bld-1*fil

代码:

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

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


一般来说,如果你没有线性混合,你必须将第一个公式改为bld=a*org+b*fil,然后从中计算剩余的。。。对于线性混合
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.5
org=2*bld-1*fil

代码:

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

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


一般来说,如果你没有线性混合,你必须将第一个公式改为bld=a*org+b*fil,然后从中计算剩余的。。。对于线性混合
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.5
org=2*bld-1*fil

代码:

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

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


一般来说,如果你没有线性混合,你必须将第一个公式改为
bld=a*org+b*fil
,然后从中计算出其余的。

非常感谢你解释它是如何工作的。这对我帮助很大!非常感谢您对其工作原理的解释。这对我帮助很大!非常感谢您对其工作原理的解释。这对我帮助很大!非常感谢您对其工作原理的解释。这对我帮助很大!