Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用特定像素边距numpy opencv从图像中剪切遮罩_Python_Image_Numpy_Opencv_Image Processing - Fatal编程技术网

Python 使用特定像素边距numpy opencv从图像中剪切遮罩

Python 使用特定像素边距numpy opencv从图像中剪切遮罩,python,image,numpy,opencv,image-processing,Python,Image,Numpy,Opencv,Image Processing,我正在玩maskrcnn()分割程序,该程序是在COCO数据集上训练的。它检测图像中的人物(以及我进一步忽略的许多其他对象),并返回一个或多个人物掩码,即布尔Numpy数组,其中包含分类为“人物”的所有像素的真值和所有其他像素的假值: 因此,当在图片中检测到多个人时,输入的图像(uint8形状数组(39002922,3))成为掩码(布尔形状数组(39002922))或多个掩码 现在,我可以使用此遮罩通过一些简单的Numpy数组索引将人物从图像中删除: mask3d = np.dstack([m

我正在玩maskrcnn()分割程序,该程序是在COCO数据集上训练的。它检测图像中的人物(以及我进一步忽略的许多其他对象),并返回一个或多个人物掩码,即布尔Numpy数组,其中包含分类为“人物”的所有像素的真值和所有其他像素的假值:

因此,当在图片中检测到多个人时,输入的图像(uint8形状数组(39002922,3))成为掩码(布尔形状数组(39002922))或多个掩码

现在,我可以使用此遮罩通过一些简单的Numpy数组索引将人物从图像中删除:

mask3d = np.dstack([mask]*3)
cut_out_mask = np.invert(mask3d)
res = np.where(cut_out_mask, 0, image)
这将返回以下图像:

由于Mask_RCNN程序返回的掩码非常紧凑,我想添加几个像素的边距(比如说15px),因此我得到如下结果:


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

您正在寻找的函数是
cv2.filter2D()

我为您编写了一个简短的演示:

import numpy as np
import cv2
首先,我们创建一个演示蒙版,中间包含一个正方形:

mask = np.zeros((300, 300))
mask[100:200, 100:200] = 1
然后我们为filter2D函数创建内核:

kernel = np.ones((32, 32))
我使用了32号,以获得所需的15像素填充

paddedMask = cv2.filter2D(mask, 1, kernel)
仅用于演示,我使用以下代码显示图像:

image = cv2.threshold(np.array(paddedMask, dtype=np.uint8), 1, 255, 1)[1]
cv2.imshow("Test", image)
cv2.imshow("Org", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
希望有帮助。

您可以使用形态学操作来加宽遮罩:

new_mask = cv2.dilate(mask, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (50,50)))
import cv2

# Read the mask from a file (for testing).
mask = cv2.imread("sample_mask.png", cv2.IMREAD_GRAYSCALE);

new_mask = cv2.dilate(mask, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (50,50)))

# Display mask and new_mask
cv2.imshow('mask', mask)
cv2.imshow('new_mask', new_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
加载遮罩并加宽遮罩的示例代码:

new_mask = cv2.dilate(mask, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (50,50)))
import cv2

# Read the mask from a file (for testing).
mask = cv2.imread("sample_mask.png", cv2.IMREAD_GRAYSCALE);

new_mask = cv2.dilate(mask, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (50,50)))

# Display mask and new_mask
cv2.imshow('mask', mask)
cv2.imshow('new_mask', new_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

掩码:

新屏蔽:

一种方法是增加掩模的表面积。根据遮罩形状,可以使用创建不同的结构元素形状和大小。例如,如果您的遮罩形状为矩形,您可能希望使用
cv2.MORPH\u RECT
,或者如果您的遮罩形状为圆形,则可以使用
cv2.MORPH\u eliple
。此外,您还可以更改内核大小和迭代次数来扩展。在放大遮罩后,您可以使用来获得结果。下面是一个最小的可复制示例:

原始图像

面具

扩张

按位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()


您正在寻找
cv2.deplate
。我们的想法是将掩码放大,然后按位放大,并与原始输入图像一起使用
paddedMask=cv2.filter2D(掩码,1,数组)
中的
array
?我猜你的意思是
内核
?在
image=cv2.threshold(np.array(padding,type=np.uint8),1255,1)[1]
?@dirkscollinger感谢你的评论。我更新了帖子,希望能更好的理解。你的问题应该由“知道”邮报来回答。