gpt4 book ai didi

python - 尽可能高效地在 Python 中叠加混合模式(Numpy、OpenCV)

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:43 25 4
gpt4 key购买 nike

假设我有两个 numpy 图像数组,ab,尺寸相同,8 位颜色,RGB 格式。现在假设我想生成一个新的 numpy 数组,其像素值是使用“叠加”混合模式组合的前两个数组的像素值。

它的定义,摘自维基百科,如下,其中b是顶层,a是底层:

enter image description here

在公式中,我相信 ab 是根据它们的“白度”表示的,即完全白色的像素为 1,完全黑色的像素是 0。我不确定色调如何影响它。

我不确定是否有更快的方法来执行此操作,而不是逐个像素地迭代两个图像,这对于 1920x1080 图像来说真的很慢。我需要能够尽快完成此操作。

例如,我设法按如下方式实现加法混合模式:

import numpy as np
import cv2

a = cv2.imread("a.jpg", cv2.IMREAD_UNCHANGED)
b = cv2.imread("b.jpg", cv2.IMREAD_UNCHANGED)

a = a.astype(float)
b = b.astype(float)

ab = a
for i in range(len(ab)):
ab[i] = a[i] + b[i]

cv2.imwrite('Out.png', ab)

它看起来非常快,而且肯定比尝试通过逐个像素迭代来实现同样的事情要快得多。但再次强调,这只是 Addition 混合模式,我需要 Overlay 混合模式。

如果您知道任何以 numpy 数组形式在两个 RGB 图像之间进行叠加混合模式的非常有效的 Python 实现,请帮我找到它。如果没有,您能否尽可能高效地实现它?

最佳答案

import numpy as np
import cv2

a = cv2.imread("a.jpg", cv2.IMREAD_UNCHANGED)
b = cv2.imread("b.jpg", cv2.IMREAD_UNCHANGED)

a = a.astype(float)/255
b = b.astype(float)/255 # make float on range 0-1

mask = a >= 0.5 # generate boolean mask of everywhere a > 0.5
ab = np.zeros_like(a) # generate an output container for the blended image

# now do the blending
ab[~mask] = (2*a*b)[~mask] # 2ab everywhere a<0.5
ab[mask] = (1-2*(1-a)*(1-b))[mask] # else this

我认为应该这样做。现在 ab 是 -1,2 上的 float 图像,是 ab 的混合。这将相对较快,因为它使用广播掩码 而不是循环。我很想知道速度差异。


以下 Material 由 Mark Setchell 于 2018 年 11 月 16 日添加,只是为了让你们都知道谁是有罪的一方:-)

Kayaks 先生的代码计算的值是 0..1 范围内的 float ,而 imwrite() 期望 0..255 范围内的 uint8。所以你只需要在他的代码底部添加以下内容:

# Scale to range 0..255 and save
x=(ab*255).astype(np.uint8)
cv2.imwrite('result.png',x)

如果您将这两张图片分别设为 a.jpgb.jpg:

enter image description here enter image description here

您将在左侧获得结果 - 如果您选择Overlay 混合模式,则右侧的结果是您从 Photoshop 获得的结果:

enter image description here enter image description here

关于python - 尽可能高效地在 Python 中叠加混合模式(Numpy、OpenCV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52141987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com