2

这是我的旧问题的延续。

给定非矩形区域,我如何枚举其中的所有像素并将它们排列为单个向量?顺序无关紧要(尽管应该是确定性的)。是否有任何快速方法(或至少是标准功能)或者我最好的方法是迭代图像中的像素并仅从 ROI 中提取那些?

如果以后可以从该向量恢复区域数据,则额外加分。

4

2 回答 2

2

您可以numpy.where()为此使用功能。您不必遍历像素。

我将继续你的最后一个问题。在接受的答案中,创建了一个蒙版,您在其上绘制了一个多边形,以确定蒙版区域。您所要做的就是简单地找到该掩码图像中像素为 255 的位置。

ROI_pixel_locations = np.transpose(np.where(mask[:,:,0]==255))

这将为您提供 x,y 位置的 Mx2 数组。

如果您使用的是 OpenCV 2.4.4 或更高版本,它的功能cv2.nonzero()完全相同。

笔记 :

在上一个问题中,接受的答案会创建 3 通道蒙版图像。如果是单通道蒙版图像,您只需像这样给出:

ROI_pixel_locations = np.transpose(np.where(mask==255))

但是在 AND 操作期间,您修改行如下:

masked_image = cv2.bitwise_and(image,image, mask=mask)
于 2013-04-19T16:57:41.690 回答
1

提取区域

您可以使用 numpy.nonzero()

mask_1c = mask[:, :, 0]
indexes = mask_1c.nonzero()

mask_1c是否存在,因为在您之前的问题中,您有一个 3 通道蒙版图像。

存储为向量

如果您希望将内容存储为单个数组(而不是数组元组)

indexes_v = np.array(indexes).T # Returns an Nx2 matrix

使用区域

假设您随后想要反转该区域,例如:

image[indexes[0], indexes[1], :] = 255 - image[indexes[0], indexes[1], :]

我假设图像是类型的np.uint8(最大值为255)。

于 2013-04-19T20:41:24.443 回答