有没有办法增加cv2.findContours返回的积分数量?

时间:2019-12-07 10:41:43

标签: python-3.x opencv computer-vision contour image-segmentation

对于一个我试图匹配拼图游戏的项目,我写了一些代码来确定拼图两边的凹痕(向内和向外)。我添加了两个示例图像来显示结果。

Inward indentation

Outward indentation

可以很好地检测到所有缩进,但是其准确性并不总是如预期的那样。我认为这是由于 cv2.findContours()导致的,该点只能提供有限的点数。我提供了cv2.findContours()的代码。

imshape = l.getImageShape(image)
ret, thresh = cv2.threshold(imshape, 0, 254, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

我选择仅将外部线与RETR_EXTERNAL一起使用,因为这些线是唯一需要的轮廓。我还决定使用CHAIN_APPROX_NONE来保存每一个点,即使我实际上不需要太多有关侧面笔直部分的信息。但是,CHAIN_APPROX_SIMPLE还删除了关键(缩进)部分的某些点,从而进一步降低了准确性。

第一个函数getImageShape只是以类似于脱粒的方式获取形状,但我发现预先使用此方法可获得更好的结果,而不是像以前那样仅将源图像作为cv2.threshold函数的输入参数代码。

def getImageShape(img):
    gray   = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray   = cv2.medianBlur(gray, ksize=5)
    thresh = cv2.threshold(gray, 0, 254, cv2.THRESH_BINARY)[1]
    thresh = cv2.blur(thresh, ksize=(3, 3))
    return thresh

由于准确性不佳(难题一侧的宽度/高度大约有4%的误差),仅根据其缩进位置将两侧相互匹配会导致多种“可能”的解决方案。我希望有一种方法可以增加cv2.getContours返回的点数,但是在openCV文档中找不到任何有关该点的信息。

如果这是不可能的,那么我将不得不添加一些图像连续性检测算法(但这将使其无法仅通过形状匹配块)。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果我可能建议其他方法: 您可以通过使用SobelPrewitt过滤器计算图像梯度来尝试使轮廓可见,并在进行一些简单的后处理之后使用Canny边缘检测。

这就是我使用的内容,请注意,我使用的是您在轮廓上带有标记的图片,因此可以忽略一些不一致之处。

Original

Sobel

Postprocessed

Outlines