【问题标题】:Apply mask to image with OpenCv Python使用 OpenCv Python 将蒙版应用于图像
【发布时间】:2018-04-25 16:49:38
【问题描述】:

我正在尝试将 opencv 与 python 一起使用,但我遇到了这个问题:

我有一个图像和一个二进制掩码(具有 0 和 255 的单通道图像) 我想迭代掩码的每个像素,并根据掩码像素的值对原始图像执行一些操作。 我如何使用 numpy 优化来做到这一点?

例如,假设我想创建一个新图像,其中每个像素在掩码中的值为 0 时保持不变,如果掩码中的像素为 255,则将其设置为 (0,0,255),例如:

def inpaint(originalImage, mask):
    [rows, columns, channels] = originalImage.shape
    result = np.zeros((rows,columns,channels))
    for row in range(rows):
        for column in range(columns):
            if(mask[row,column]==0):
                result[row,column] = originalImage[row,column]
            else:
                result[row,column] = (0,0,255)
    return result

如何使用 numpy 进行优化? 非常感谢

【问题讨论】:

    标签: python numpy opencv


    【解决方案1】:

    我们可以在将掩码扩展到3D之后使用np.where,让它以广播的方式进行选择-

    np.where(mask[...,None]==0, originalImage,[0,0,255])
    

    或者更接近原始代码,制作一个副本,然后使用mask 一次性分配 -

    result = originalImage.copy()
    result[mask!=0] = (0,0,255)
    

    【讨论】:

    • 非常感谢 mutch,它似乎可以工作,但如果我尝试使用 imshow 它会显示黑色图像,如果我使用 resize() 我会收到此错误:cv2.error: OpenCV(3.4. 1) C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\resize.cpp:3922: error: (-215) func != 0 in function cv::hal::resize
    • @FedericoTaschin 我认为您需要使用result.astype(np.uint8) 转换为uint8 类型
    • 但是,第二种方法有效!非常感谢!我还有一个问题:如果我想对每个像素执行更复杂的操作,而不是简单的赋值,例如调用函数,该怎么办?
    • @FedericoTaschin 你知道如何通过调用函数对每个像素执行更复杂的操作吗?介意在这里分享吗?
    • 不,我切换到Java opencv是因为一些操作太复杂,没有内置函数的python无法完成
    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多