python - 基于其他图像的蒙版“填充”区域
问题描述
我有一个最小示例的以下问题:
我有两张相同大小的图像(见下文) - 一张显示不同的椭圆,另一张显示其中一些椭圆内的感兴趣区域。我现在想要的是将包含这些区域的椭圆着色为红色,而那些不包含这些区域的椭圆则为蓝色,或者使用其他一些标签来分隔这些类型的椭圆。为此,我已经尝试使用 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)
现在有三个问题:
对于 bluemask,由于某种原因,两个椭圆被遗漏了。逻辑的两个部分 - 反转的红色掩码而不是黑色背景标签 0 - 分别包括这两个部分,因此两者都应该存在。我错过了什么吗?
是否有更好更快的方法来实现我想要的?可能有一个内置方法可以完成我正在尝试做的事情,但我还没有遇到过,因为我对 OpenCV 还很陌生。
最后,我还想评估这个粒子是否是“实数”红色,例如,如果 roi 与整个相关椭圆相比非常小,则不应将其标记为红色。我还没有考虑太多,因为我希望基本的东西能正常工作,而且我已经觉得我的实现会慢得要命。因此,如果您对此有任何想法,我将非常高兴。
谢谢!example.png: roi.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循环内的代码?
解决方案
推荐阅读
- r - 使用粘贴连接文本以调用 r 中的向量
- javascript - 使用 JavaScript 的 HTML 中未显示数据
- c++ - 从文件输入和输出
- node.js - 如何通过 CodeDeploy 在 AWS EC2 上构建前端?
- python - 如何在我的损失函数中添加 L2 正则化项
- javascript - Bootstrap javascript在Django中不起作用
- .htaccess - 使用具有根目录的 htaccess 文件在 php 中重写 URL
- excel - Excel 从非堆叠单元格创建数组
- c# - 声明带参数和不带参数接收的通用委托并将其添加到字典 C#
- excel - 使用 StyleFrame 的 to_excel 方法将多个 python 数据框复制到 excel 中