【问题标题】:How to draw a Polygon Patch from a bitmask如何从位掩码绘制多边形补丁
【发布时间】:2022-01-20 08:54:57
【问题描述】:

在 matplotlib 中,我使用 matplotlib.pyplot.imshow 显示图像。我也知道如何画一个填充 Polygon。其中一个必需的参数是xy 一个形状为 (N, 2) 的 numpy 数组,其中 N 行中的每一行代表一个多边形点的 x-y 坐标。

现在,渲染到图像上的填充多边形也可以用位掩码表示(与图像具有相同的高度和宽度),填充为 1,否则为 0。

我的问题是,如果我有一个位掩码而不是多边形点,有没有办法直接从中绘制 matplotlib 中的填充多边形?我的意思是在一般情况下,位掩码可能有多个连续的 blob,或者它可能有孔:

它不一定是多边形,但它仍然应该是某种Artist

注意:有这个类似的问题Create matplotlib polygon patch using image mask,但没有得到满意的回答。寻找轮廓是一个想法,但我想知道matplotlib中是否有更直接的东西。

【问题讨论】:

  • 这一切都非常不清楚和抽象。您能否扩展您的问题 (minimal reproducible example) 以包含示例图像和位掩码?
  • @Alex 我已经编辑了我的问题以便更清楚。如果还没有回答,也许我可以稍后再回来添加示例。
  • 嗯,AxesImage 也是一位艺术家,所以如果它不需要是多边形,您可以将位掩码作为另一个图像覆盖在您的图像上。
  • @Stef 嗯好的,有道理,我会试一试。谢谢!

标签: python matplotlib


【解决方案1】:

您可以通过将位掩码转换为 RGBA 图像(在示例中为 overlay),将位掩码作为另一个 AxesImage 覆盖在您的图像上:

import matplotlib.pyplot as plt
from matplotlib.cbook import get_sample_data
import numpy as np

with get_sample_data("grace_hopper.jpg") as file:
    img = plt.imread(file)

fig, (ax1, ax2) = plt.subplots(ncols=2)

bitmask = np.zeros(img.shape[:2], dtype=np.uint8)
bitmask[500:580, 100:400] = 1
ax1.imshow(bitmask, cmap='gray')
ax1.set_title('Bitmask')

# 50 % opaque overlay
overlay = np.dstack((np.full(bitmask.shape + (3,), [255, 255, 0], dtype=np.uint8),
                     bitmask * 128))
ax2.imshow(img)
ax2.imshow(overlay)
ax2.set_title('Overlayed Bitmask')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    相关资源
    最近更新 更多