如何矢量化以下 python 代码(图像转换)?

How can I vectorize the following python code (image transition)?

我刚开始学习向量化方法,还很难适应。我想使用 OpenCV 和 NumPy 制作图像过渡效果。作为第一步,我只是将图像沿对角线剪切在一起,而不关心混合效果。

im3 = np.zeros(im1.shape, np.uint8)

yMax = int(im1.shape[0])
xMax = int(im1.shape[1])
border = (xMax+yMax)/2

for y in range(yMax):
    for x in range(xMax):
        if((y + x) > border):
            im3[y , x, :] = im1[y, x, :]
        else:
            im3[y, x, :] = im2[y, x, :]

(其中 im1 和 im2 是之前读取的两个相同大小的 bgr 图像)

但我知道使用 for 循环真的很慢,所以我想使用矢量化方法。作为下一步,我移动了 if else。

for y in range(yMax):
    for x in range(xMax):  
        im3[y, x, :] =  im1[y, x, :] * ((y + x) > border)
        im3[y, x, :] += im2[y, x, :] * ((y + x) < border)

但后来我意识到我仍然看不到摆脱 for 循环的方法,因为即使我可以改变

imx[y, x, :] to imx[ :, :, :]

我还需要 x 和 y:

((y + x) > border)

我几乎可以肯定有一些非常简单的方法可以做到这一点,或者我使用了错误的方法。

我不确定你是否在做你认为你在做的事情,但天真地,这就是你做事的方式:

im3 = np.where(np.indices(im1.shape[:2]).sum(0)[:, :, None] > border, im1, im2)

np.indices(im1.shape[:2]).sum(0) 只是 x + y 部分,没有执行 for 循环,where 允许您根据是否 x + y > borderTrue (im1) 或假 (im2).