【问题标题】:How can I vectorize the following python code (image transition)?如何矢量化以下 python 代码(图像转换)?
【发布时间】:2021-01-04 22:24:13
【问题描述】:

我刚开始学习矢量化方法,但我仍然很难习惯。我想使用 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)

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

【问题讨论】:

    标签: python numpy vectorization


    【解决方案1】:

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

    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 &gt; borderTrue (im1) 还是 False ( im2)。

    【讨论】:

    • 是的,我也不太确定,我只是在试验一些东西。起初我有一个错误:“ValueError:操作数不能与形状一起广播(1704,2272)(1704,2272,3)(1704,2272,3)“但是如果我将频道分开,它可以工作im3 [ :,:,0] = np.where((np.indices(im1.shape[:2]).sum(0) > 边框), im1[:,:,0], im2[:,:,0] ) 等。所以谢谢!
    • 认为我解决了广播问题,现在检查。
    猜你喜欢
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2018-02-15
    • 2015-07-29
    • 2019-04-25
    • 2020-11-11
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多