【问题标题】:NumPy/OpenCV 2: how to enumerate all pixels from region?NumPy/OpenCV 2:如何枚举区域中的所有像素?
【发布时间】:2013-04-13 03:09:32
【问题描述】:

这是我older question 的延续。

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

如果以后可以从该向量恢复区域数据,则附加加号。

【问题讨论】:

    标签: opencv image-processing numpy region


    【解决方案1】:

    您可以为此使用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)
    

    【讨论】:

      【解决方案2】:

      提取区域

      您可以使用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)。

      【讨论】:

      • 感谢所有评论员,但这个答案似乎更完整。
      猜你喜欢
      • 1970-01-01
      • 2013-02-26
      • 2010-10-01
      • 2022-01-14
      • 2022-06-11
      • 2020-07-01
      • 2016-07-24
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多