从另一个图像中删除叠加图像
Removing an overlay image from another image
所以我有两张图片,一张是原来的,另一张应该是叠加在上面的。叠加图像是半透明的,假设为白色,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 = cv2.addWeighted(bld,2,fil,-1, 0)
您也可以使用 org = 2*bld - fil
但是 openCV 会截断超出的值,例如8U 类型为 255(称为 saturate_cast),因此如果您在计算前不转换为 16/32 位类型,这将不起作用。
一般来说,如果您不是线性混合,则必须将第一个公式更改为 bld = a*org + b*fil
并从中计算其余公式。
所以我有两张图片,一张是原来的,另一张应该是叠加在上面的。叠加图像是半透明的,假设为白色,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 = cv2.addWeighted(bld,2,fil,-1, 0)
您也可以使用 org = 2*bld - fil
但是 openCV 会截断超出的值,例如8U 类型为 255(称为 saturate_cast),因此如果您在计算前不转换为 16/32 位类型,这将不起作用。
一般来说,如果您不是线性混合,则必须将第一个公式更改为 bld = a*org + b*fil
并从中计算其余公式。