【问题标题】:Grouping Nearby Contours/Bounding Rectangles分组附近的轮廓/边界矩形
【发布时间】:2021-09-06 13:01:21
【问题描述】:

我有一个包含模糊矩形的图像:

使用 opencv 我想将附近的矩形分组以获得预期的输出:

我使用扩张形态变换来放大形状,以便将它们连接起来以创建更大的形状,从而产生:

它不能很好地将较大的矩形连接到右边,内核大小 (40,40) 任何较大的较小矩形连接成一个大矩形而不是分开。

可以使用 cv2.minAreaRect(c) 并按矩形的相似角度分组吗?或任何基于特征的检测来获取某个区域的矩形数量?

【问题讨论】:

  • 一个薄的垂直内核应该做你想做的事。只需使其高于您要连接的所有对象的最小间隙的最大值即可。
  • @fmw42 谢谢,垂直内核效果更好,但它使左侧的垂直矩形更高,并将该列合并为一个。将它们分开后会发生侵蚀吗?
  • 在下面查看我的答案。您需要使用形态接近以避免延长。

标签: python numpy opencv image-processing


【解决方案1】:

一个薄的垂直内核应该做你想做的事。只需使其高于您要连接的所有对象的最小 1/2 间隙的最大值即可。看起来大约 65 像素应该可以工作。这是 Python/OpenCV 中的形态关闭结果,它似乎连接了您想要的部分。

输入:

import cv2
import numpy as np

# read image as grayscale
img = cv2.imread('lines.png', cv2.IMREAD_GRAYSCALE)

# threshold to binary
thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY)[2]

# apply morphology 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,65))
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# write results
cv2.imwrite("lines_morphology.png", morph)

# show results
cv2.imshow("thresh", thresh)
cv2.imshow("morph", morph)
cv2.waitKey(0)

结果:

【讨论】:

  • 谢谢,正是我正在寻找的右侧矩形。是否可以将其设置为使左侧imgur.com/a/vMXZjDl 不合并为一个?
  • 不太可能。这取决于哪个分组需要填补更大的空白以连接它们。测量,看看哪个更大。我认为最右边的集群更大。所以要连接它们,你需要一个比那个组更大的内核..
  • 您需要一个比需要填充的最大间隙稍大的内核,以便连接所有组件。任何间隙较小的都将连接,而任何间隙较大的将保持断开连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2015-08-23
  • 2013-05-08
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多