【发布时间】:2013-04-13 03:09:32
【问题描述】:
这是我older question 的延续。
给定非矩形区域,我如何从中枚举所有像素并将它们排列为单个向量?顺序无关紧要(尽管应该是确定性的)。是否有任何快速方法(或至少是标准功能)或者我最好的方法是迭代图像中的像素并仅从 ROI 中提取那些?
如果以后可以从该向量恢复区域数据,则附加加号。
【问题讨论】:
标签: opencv image-processing numpy region
这是我older question 的延续。
给定非矩形区域,我如何从中枚举所有像素并将它们排列为单个向量?顺序无关紧要(尽管应该是确定性的)。是否有任何快速方法(或至少是标准功能)或者我最好的方法是迭代图像中的像素并仅从 ROI 中提取那些?
如果以后可以从该向量恢复区域数据,则附加加号。
【问题讨论】:
标签: opencv image-processing numpy region
您可以为此使用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)
【讨论】:
您可以使用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)。
【讨论】: