【问题标题】:How to obtain (x,y) coordinates of a shape found using mask in OpenCV, Python?如何获取在 OpenCV、Python 中使用掩码找到的形状的(x,y)坐标?
【发布时间】:2020-10-22 01:31:06
【问题描述】:

我正在尝试定位图像上的某些项目。简化形式的图像如下所示:

我想获取第二个矩形以及三个彩色矩形顶部的黑色粗体文本的 (x,y) 坐标。

我已经准备好了面具,除了我无法弄清楚的黑色文本的面具。但是,文本总是在矩形的顶部,所以如果我能够找出底部大矩形的位置,我也会得到文本的位置。

这些是我得到的输出:

我尝试使用基于this comment 的 ConnectedComponents 函数,但除了对各种对象进行着色和分组之外,我没有设法继续前进,所以我没有在下面包含那个 sn-p 以使事情变得清晰可能。

到目前为止,这是我的代码:

import cv2
import numpy as np
import imutils

PATH = "stackoverflow.png"
img = cv2.imread(PATH)
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

mask_border = cv2.inRange(imgHSV,np.array([0,0,170]),np.array([0,0,175]))
mask_green  = cv2.inRange(imgHSV,np.array([76,221,167]),np.array([76,221,167]))
mask_pink   = cv2.inRange(imgHSV,np.array([168,41,245]),np.array([172,41,252]))
mask_red    = cv2.inRange(imgHSV,np.array([4,207,251]),np.array([4,207,251]))
#mask_black  = ???

all_masks = cv2.bitwise_or(mask_border, mask_green)
all_masks = cv2.bitwise_or(all_masks, mask_pink)
all_masks = cv2.bitwise_or(all_masks, mask_red)

cv2.imshow("Masks", all_masks)

imgResult = cv2.bitwise_and(img,img,mask=all_masks)

cv2.imshow("Output", imgResult)

cv2.waitKey(0)

【问题讨论】:

    标签: python opencv image-processing


    【解决方案1】:

    我认为最简单的方法是将cv2.ConnectedComponentsWithStats 应用于您的蒙版图像。结果中包括质心,即每个“集群”的中心坐标。

    请看这里:https://stackoverflow.com/a/35854198/221166

    您可能需要事先应用 Dilation,将内岛(例如 b、d、g 字符)与周围的矩形连接起来。

    【讨论】:

      【解决方案2】:

      您可以对图像进行二值化,然后应用一些形态学运算来获得正确的连接组件。这是一种方法。您可以对其进行微调以获得正确的输出。

      import numpy as np
      import cv2
      import os
      image=cv2.imread('path/to/image.jpg')
      ###binarising
      gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
      ret2,th2 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
      
      ###applying morphological operations to dilate the image
      kernel=np.ones((3,3),np.uint8)
      dilated=cv2.dilate(th2,kernel,iterations=3)
      
      ### finding contours, can use connectedcomponents aswell
      _,contours,_ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
      
      ### converting to bounding boxes from polygon
      contours=[cv2.boundingRect(cnt) for cnt in contours]
      ### drawing rectangle for each contour for visualising
      for cnt in contours:
          x,y,w,h=cnt
          cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
      

      普通二值图像

      放大的图像

      带有检测到的边界框的输出

      【讨论】:

        【解决方案3】:

        试试这个例子:simple blob detector。我会在你的实际蒙版上运行它,而不是 rgb 图像,因为它可以在像你的蒙版这样的二值化图像上很好地工作。然后从返回的关键点中提取 pt 和 size 属性将为您提供 blob 的中心和半径。 (不确定它是平均半径还是最大半径而不进行测试)。不过,我什至可能不会将半径用于您的用例,从每个 blob 的中心点,我会在 -x 和 -y 轴(分别)上迭代搜索,从该点开始。在每一步我都会检查它是黑色还是白色像素,然后我会等到我看到一些 可调整变量 一行中的黑色像素数(基本上是为了避免触发文本,但试图触发在盒子的出口和背景的入口处)。 x 和 y 的坐标将位于框的左上角。如果你愿意,你也可以在正 x 和 y 方向上这样做,以获得完整的边界框。

        SimpleBlobDetector

        KeyPoint

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-09
          • 1970-01-01
          • 2022-11-13
          • 2021-03-25
          • 2019-03-03
          • 1970-01-01
          • 2018-05-12
          • 1970-01-01
          相关资源
          最近更新 更多