首页 > 解决方案 > 基于其他图像的蒙版“填充”区域

问题描述

我有一个最小示例的以下问题:

我有两张相同大小的图像(见下文) - 一张显示不同的椭圆,另一张显示其中一些椭圆内的感兴趣区域。我现在想要的是将包含这些区域的椭圆着色为红色,而那些不包含这些区域的椭圆则为蓝色,或者使用其他一些标签来分隔这些类型的椭圆。为此,我已经尝试使用 connectedComponents 并取得部分成功:

import cv2 as cv
import numpy as np

example = cv.imread('example.png', cv.IMREAD_GRAYSCALE)
roi = cv.imread('roi.png', cv.IMREAD_GRAYSCALE)

_, comp = cv.connectedComponents(example)

# get list of labels where the roi is present
redmarks = np.unique(comp[roi != 0])

# components with labels mentioned above are red otherwise blue
redmask = np.isin(comp, redmarks)
bluemask = np.invert(redmask) & comp > 0

result = cv.cvtColor(example, cv.COLOR_GRAY2RGB)
result[redmask] = [0, 0, 255]
result[bluemask] = [255, 0, 0]

cv.imshow("Test", result)
k = cv.waitKey(0)

现在有三个问题:

  1. 对于 bluemask,由于某种原因,两个椭圆被遗漏了。逻辑的两个部分 - 反转的红色掩码而不是黑色背景标签 0 - 分别包括这两个部分,因此两者都应该存在。我错过了什么吗?

  2. 是否有更好更快的方法来实现我想要的?可能有一个内置方法可以完成我正在尝试做的事情,但我还没有遇到过,因为我对 OpenCV 还很陌生。

  3. 最后,我还想评估这个粒子是否是“实数”红色,例如,如果 roi 与整个相关椭圆相比非常小,则不应将其标记为红色。我还没有考虑太多,因为我希望基本的东西能正常工作,而且我已经觉得我的实现会慢得要命。因此,如果您对此有任何想法,我将非常高兴。

谢谢!example.png: 例子.png roi.png 投资回报率.png 重叠: 在此处输入图像描述 当前结果: 结果

编辑:好吧,我有一个解决方案 3.:

import cv2 as cv
import numpy as np


if __name__ == '__main__':

    example = cv.imread('example.png', cv.IMREAD_GRAYSCALE)
    roi = cv.imread('roi.png', cv.IMREAD_GRAYSCALE)
    result = np.zeros((example.shape[0], example.shape[1], 3), dtype=np.uint8)

    count, comp = cv.connectedComponents(example)

    for c in range(1, count+1):
        # mask of c-connected component
        mask = np.zeros(example.shape, np.uint8)
        mask[comp == c] = 1

        # average of roi in this mask
        mn, _, _, _ = cv.mean(roi, mask=mask)

        # everything over 20% shared area red, else blue
        pr = 20
        if mn > 255*pr/100:
            result[comp == c] = [0, 0, 255]
        else:
            result[comp == c] = [255, 0, 0]

    cv.imshow("Test", result)
    k = cv.waitKey(0)

但是2. 的问题对于这个解决方案来说是非常大的。虽然对于此示例,它与其他代码一样快,而不考虑区域,但对于具有较大分辨率和组件数量的示例(不能/不会共享此示例) ,它要慢得多。有没有办法优化for循环内的代码?

标签: pythonnumpyopencv

解决方案


推荐阅读