【问题标题】:OpenCV Perimeter and Area given point in connected componentOpenCV 周长和面积给定点在连通组件中
【发布时间】:2017-01-24 13:05:06
【问题描述】:

假设我有一个二值图像,我想在 OpenCV 中执行以下操作:给定一个点,测量该点所属的连通分量的面积和周长..

def areaAndPerimeter(point):
   ...do some stuff...
   return area, perimeter

我知道我可以使用cv2.findContours() 来查找每个连接组件的周长和面积,但我不知道如何将该信息与输入点配对。 point的连通分量对应哪个周长和面积

【问题讨论】:

  • 我认为你会这样做 connectedComponentsWithStats() 并且它用相同的颜色标记每个 blob 中的所有点。因此,您会找到与您的点相对应的颜色(即标签),以找到它属于哪个 blob。我可能完全错了!我相信它在 Matlab 中称为bwlabel()
  • 是的,我开始研究一个解决方案,我只使用普通的旧 connectedComponents(),然后逐个提取每个组件并在每个组件上分别运行 findContours(),但这似乎是一种浪费我可以在整个图像上运行一次findContours(),然后一起跳过连接的组件。

标签: python opencv image-processing connected-components


【解决方案1】:

对于这个函数,我会从该点开始增长一个区域。下面是一个伪代码:

 - Define a point queue Q
 - Define a foreground point vector F
 - Define a boundary point vector B
 - Put starting point in Q
 - While Q is not empty
      - p = Q.top
      - if p is foreground
          - F.push(p)
          - Q.push(neighbors of p)
      - else 
          - B.push(p)
- Return size(F), size(B)

最后,F 包含前景像素,B 包含边界像素(白色像素外的黑色像素)。因此,size(F) 给出面积,size(B) 给出周长。

【讨论】:

  • 这些是周长和面积的好方法吗?我想它们可以被视为定义,但是当我尝试这样做时,它们与 opencv 函数cv2.arcLength()cv2.contourArea() 的结果不匹配。轮廓本身的大小与您对周长的定义相匹配,但 cv2.arclength() 函数不等于它,并且给出的结果更接近我的预期。
  • 由于有不同的距离度量(即欧几里得距离与曼哈顿距离),面积和弧长也取决于您的近似值,因为图像域是离散的。上面的代码给出了“前景中有多少像素?”和“边界上有多少像素?”。如果要使用 OpenCV 的近似值,则使用 B 中的所有点并运行 cv2.contourArea(B)cv2.arcLength(B)
  • 我明白了,我将尝试根据我目前正在做的事情来计时,即使用 cv2.connectedComponents() 查找连接的组件,提取我的观点的组件,然后使用 cv2.findContours() 和随后cv2.contourArea()cv2.arcLenth()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2017-11-21
  • 2013-12-09
  • 1970-01-01
相关资源
最近更新 更多