将轮廓垂直组合并获得凸包 - OpenCV - Python

3
我有这样的角色图像: 获取轮廓和凸包后,输出如下: 我使用了以下代码:
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)

如您在下图中所见,有一些被识别出的轮廓与原始字符垂直对齐。但是这些轮廓与原始核心字符分离(实际上是叫做僧伽罗语的修饰符- සිංහල)。现在我想将这些垂直对齐的轮廓与核心字符合并。最终输出应该如下所示。我该如何高效地完成?

你可以尝试根据两个轮廓中心之间的距离进行合并。 - sshashank124
我考虑过这个问题,如果最终合并是水平的,那该怎么办? - Ishara Madhawa
2个回答

6

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

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

enter image description here

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)

enter image description here


1
谢谢@JeruLuke,这真的很有帮助。 - Ishara Madhawa

2

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

distance = hypotenuse(distance_x * 5, distance_y)

1
假设我能够使用这个逻辑找到两个轮廓需要合并。那么我该如何合并它们? - Ishara Madhawa
根据此处描述的方法:https://dsp.stackexchange.com/questions/2564/opencv-c-connect-nearby-contours-based-on-distance-between-them - sshashank124
你将2个轮廓的点放入一个集合中,并在其上构建凸包。 - sshashank124
1
您提供的链接不够高效。答案本身也提到了这一点。无论如何,感谢您的回答。 - Ishara Madhawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接