【问题标题】:Combine contours vertically and get convex hull - opencv - python垂直组合轮廓并获得凸包 - opencv - python
【发布时间】:2018-10-30 03:16:28
【问题描述】:

我有这样的角色图像:

得到contoursconvexHull后输出是这样的:

为此,我使用了以下代码:

import cv2
img = cv2.imread('input.png', -1)

ret, threshed_img = cv2.threshold(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),
                        127, 255, cv2.THRESH_BINARY)
image, contours, hier = cv2.findContours(threshed_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    # get convex hull
    hull = cv2.convexHull(cnt)
    cv2.drawContours(img, [hull], -1, (0, 0, 255), 1)    
cv2.imwrite("output.png", img)

正如您在下图中所见,识别出的轮廓与原始字符垂直对齐。但是那些与原始的核心角色是分开的。 (这些实际上是僧伽罗语的修饰语 - සිංහල)

现在我想将那些垂直对齐的轮廓与核心角色合并。最终输出应如下所示。我怎样才能有效地做到这一点?

【问题讨论】:

  • 您可以尝试根据两个轮廓中心之间的距离进行合并
  • 我想了想,万一最后横向合并呢?

标签: python opencv convex-hull opencv-contour


【解决方案1】:

您可以尝试使用具有垂直矩形形状的内核执行形态学运算。这样,原始字符之上的某些字符将被合并为一个。

rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 30))
threshed = cv2.morphologyEx(th2, cv2.MORPH_CLOSE, rect_kernel)
cv2.imshow('threshed', threshed)

imgContours, Contours, Hierarchy = cv2.findContours(threshed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in Contours:
    hull = cv2.convexHull(cnt)
    cv2.drawContours(img2, [hull], -1, (0, 0, 255), 1) 
cv2.imshow('convex hull', img2)

【讨论】:

  • 谢谢@JeruLuke,这真的很有帮助。
【解决方案2】:

您可以尝试根据轮廓中心之间的距离合并轮廓。由于您想更加强调垂直连接,您可以修改距离函数,使其更加重视垂直连接。这可以通过在阈值方面将水平距离视为更“昂贵”来完成。例如,要强调垂直接近而不是水平接近,您可以使用大于 1 的常数来缩放水平差异:

distance = hypotenuse(distance_x * 5, distance_y)

【讨论】:

  • 假设我可以使用此逻辑找到要合并的两个轮廓。那么我该如何合并它们呢?
  • 你把 2 个轮廓的点放在 1 组中,然后在上面设置凸包
  • 您提供的链接无效。在答案中它自己提到了这一点。不管怎样,谢谢你的回答。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多