计算区域旋转矩形中的非零像素

时间:2017-11-11 15:28:18

标签: python-3.x opencv computer-vision

我有一个二进制图片,上面有一个对象和一个旋转的矩形,可以找到cv2.findContourscv2.minAreaRect。图像归一化为[0; 1] 在边界矩形内计算非零区域的最有效方法是什么?

Example image

3 个答案:

答案 0 :(得分:2)

  • 创建新的零值Mat与原始图像的大小相同。
  • 使用RotatedRect顶点在(fillConvexPoly中)绘制旋转的矩形。
  • Bitwise_and带有原始面具的图像
  • 在结果图像上应用findnonzero函数

您可以在图像的ROI上应用前面的步骤,因为您有旋转矩形的边界框。

答案 1 :(得分:2)

根据Humam Helfawi的回答,我已经调整了一些建议的步骤,所以以下代码似乎正在做我需要的:

rectangles = [(cv2.minAreaRect(cnt)) for cnt in contours]  
for rect in rectangles:
    rect = cv2.boxPoints(rect)
    rect = np.int0(rect)
    coords = cv2.boundingRect(rect)
    rect[:,0] = rect[:,0] - coords[0]
    rect[:,1] = rect[:,1] - coords[1]
    area = cv2.contourArea(rect)
    zeros = np.zeros((coords[3], coords[2]), np.uint8)
    cv2.fillConvexPoly(zeros, rect, 255)
    im = greyscale[coords[1]:coords[1]+coords[3], 
    coords[0]:coords[0]+coords[2]]
    print(np.sum(cv2.bitwise_and(zeros,im))/255)

答案 2 :(得分:1)

contours是一个积分列表。您可以使用cv2.fillConvexPoly在相同大小的空二进制图像上填充此形状,然后使用cv2.countNonZeronumpy.count_nonzero来获取占用的像素数。