python - 使用特定像素边距 numpy opencv 从图像中剪切蒙版

标签 python image numpy opencv image-processing

我正在玩在 COCO 数据集上训练的 Mask RCNN (https://github.com/matterport/Mask_RCNN) 分割程序。它检测图像中的人(以及我进一步忽略的许多其他对象)并返回一个或多个人掩码,即 bool Numpy 数组包含所有被归类为“人”的像素的真值和所有其他像素的假值:

Overlay Image

所以当在图片中检测到多人时,输入的图像(形状的uint8数组(3900,2922,3))就变成了掩码(形状的 bool 数组(3900,2922))或多个掩码。

现在我可以使用这个蒙版通过一些简单的 Numpy 数组索引将人物从图像中切出:

mask3d = np.dstack([mask]*3)
cut_out_mask = np.invert(mask3d)
res = np.where(cut_out_mask, 0, image)

这将返回以下图像:
Cut_out Image

由于 Mask_RCNN 程序返回的掩码非常紧凑,我想添加几个像素的边距(假设为 15 像素),以便我得到这样的结果:

manual

我可以利用哪些 Numpy/OpenCV 函数从原始图像中剪切蒙版(类似于 np.where),在蒙版周围添加 15 个像素的边距?

最佳答案

一种方法是使用 cv2.dilate 以增加口罩的表面积。根据您的 mask 形状,您可以使用 cv2.getStructuringElement 创建不同的结构元素形状和大小。 .例如,如果您的 mask 形状是矩形,您可能需要使用 cv2.MORPH_RECT或者如果您的面具形状是圆形,您可以使用 cv2.MORPH_ELLIPSE .此外,您可以更改内核大小和迭代次数以进行扩张。面膜扩张后,可以使用 cv2.bitwise_and 得到你的结果。这是一个最小的可重现示例:

原图



面具



扩张



按位与结果


import cv2

# Load image and mask
image = cv2.imread('1.png')
mask = cv2.imread('mask.png')

# Create structuring element, dilate and bitwise-and
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,25))
dilate = cv2.dilate(mask, kernel, iterations=3)
result = cv2.bitwise_and(image, dilate)

cv2.imshow('dilate', dilate)
cv2.imshow('result', result)
cv2.waitKey()

关于python - 使用特定像素边距 numpy opencv 从图像中剪切蒙版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60490882/

相关文章:

python - “numpy.float64”对于 scipy 函数质心不可迭代

python - 测验模型中的图像

jQuery 网络摄像头插件 - 保存图像

python - 无法从 VSCode 外部在我的 macbook pro 中使用 Python3 numpy(或 matplotlib 等)

c++ - C++ 中的图像模糊。矩阵拷贝的问题

javascript - 大背景图像导致滚动时滞后

python - numpy:填充数组的子集

python - 将 elem.send_keys 用于页面中的句柄 "Infinite Scroll"。在 Python 中使用 Selenium PhantomJS

python - 识别以特定字符结尾的单词

python - pandas.Period 可以代表任意时间跨度吗?