【问题标题】:Generate binary image of individual contours生成单个轮廓的二值图像
【发布时间】:2019-07-31 19:30:38
【问题描述】:

我正在尝试分割足球场。我找到了代表场地面积的最大轮廓。我需要使用该区域生成二进制图像。

我正在关注一篇研究论文并遵循了所有步骤,包括

  1. 转换为 HSV
  2. 捕获 H 通道
  3. 生成直方图
  4. 一些处理(未提及与问题无关)
  5. 在二值图像中查找最大的斑点

我已经使用 Contours 完成了它,并且我拥有代表字段区域的最大轮廓。

我需要使用这个特定的轮廓来生成一个新的二进制图像,它只包含这个轮廓的区域。

# Find Largest Blob
# mask is the processed binary image
# using that mask I find the contours and draw them on original 
#image
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, 
cv2.CHAIN_APPROX_NONE)
largest_blob = max(contours, key=cv2.contourArea)
cv2.drawContours(image, largest_blob, -1, (0, 0, 255), 2)

【问题讨论】:

  • 使用cv2.BoundingRect()在图像中查找ROI并使用cv2.imwrite()保存ROI怎么样?
  • @xanjay 我对存储 ROI 不感兴趣。我只想生成一个包含largest_blob 轮廓区域的二进制掩码
  • 在我看来你已经这样做了。只需在image 上将轮廓绘制为二进制,即cv2.drawContours(image, largest_blob, -1, 255, 2),其中image 的类型为uint8
  • 我必须同意@gilad。你想要什么drawContours 没有给你?

标签: python opencv cv2


【解决方案1】:

我已经使用cv2.fillPoly(noiseless_mask, [largest_blob], 255) 函数完成了它。在哪里noiseless_mask = np.zeros_like(mask)

【讨论】:

    【解决方案2】:

    你可以这样做,首先找到那些轮廓的边界矩形,

    边界矩形由绿色框表示

    x,y,w,h = cv2.boundingRect(cnt)
    

    然后使用这些来裁剪图像

    field = img[y:y+h, x:x+w, :]
    

    然后你可以对 field 对象应用二值化,更多信息可以在这里找到 https://docs.opencv.org/3.1.0/dd/d49/tutorial_py_contour_features.html

    【讨论】:

    • 我不想裁剪图像。我只想抓住最大的轮廓(我在最大的blob变量中),我想制作它的二进制图像。我正在寻找像binary_image = np.zeros((image.shape[0], image.shape[1])) 这样的东西,然后我想让给定轮廓中的所有像素都变成白色
    猜你喜欢
    • 2012-11-13
    • 2021-04-25
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2011-08-18
    • 2016-07-11
    相关资源
    最近更新 更多