其实就是用到了图片在不同背景下得到的效果,这里提供一个测试的地方
黑白
原理
这里用到图形学里的一个混合的计算公式:
现已知混合图某个像素点的值为
其在白色背景下混合值为
其实就是解个方程组
求解得
这里有个问题就是
结果
这也就是将图片混合的公式
其次是
实现
这里有两张图片


接着按照上面的结果来计算生成结果的值1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import cv2 as cv
import numpy as np
img1 = cv.imread("img1.png",0)
img2 = cv.imread("img2.png",0)
h,w = img1.shape
img3 = np.zeros((w,h,4))
for i in range(h):
for j in range(w):
r1 = img1[i][j] if img1[i][j] > 100 else 100 # 小于100的像素点都算100,增大r1
r2 = img2[i][j] * 0.35 # 为了使r2更小等比例缩小r2
alpha = 255 - r1 + r2 # 这里值为1时即为255 对应公式 1 - r1 + r2
rx = 255 * r2 / alpha # 对应r2 / alpha
img3[i][j] = (rx,rx,rx,alpha)
cv.imwrite("img.png",img3)
numpy计算
1 | r1 = (np.where(img1 < 100, 100, img1)).astype(np.uint8) |
合成结果

彩色
原理
回顾上面方程的解
解
其主要问题是
但这样的效果下的黑底并不是很好

所以需要插值来平均色彩
实现
1 | import cv2 as cv |
numpy计算
1 | image1 = image1.astype(np.float32) * scale1 |
通过调整到插值来达成效果
这是我认为还不错的结果

两张图片的区别较小时结果会更为理想