首页 > 解决方案 > 将图像放在另一个图像之上的更有效方法 - OpenCV Python3

问题描述

我编写了一个函数,它获取两个大小相等的图像并返回一个大小相同的组合图像,这样第一张图像的所有黑色像素(BGR 值为 [0,0,0])都将被像素替换第二张图片的。

我的代码如下所示:

def combine(img1, img2):
    retImage = np.zeros((img1.shape[0], img1.shape[1], 3), dtype=np.uint8)
    for x in range(img1.shape[0]):
        for y in range(img1.shape[1]):
            if (0 not in img1[x][y]):
                retImage[x][y] = img1[x][y]
            else:
                retImage[x][y] = img2[x][y]
    return retImage

显然这非常慢,特别是因为我正在按顺序处理几张 4k 图像。有没有更有效的方法来做到这一点(最好使用 OpenCV 函数,如阈值/掩码)?

标签: python-3.xnumpyopencvimage-processing

解决方案


以下代码使用 Numpy 操作执行您想要的操作,这应该比 Python 循环更有效:

pixel_has_zero = np.any(img1 == 0, axis=2, keepdims=True)    
retImage = np.where(pixel_has_zero, img2, img1)

此代码假设img1img2大小相同。img2如果不是这种情况,则需要事先切片。


推荐阅读