任何形状四边形的最小边界框或凸包?

Posted

技术标签:

【中文标题】任何形状四边形的最小边界框或凸包?【英文标题】:Minimum Bounding Box or Convex Hull for any shape quadrilateral? 【发布时间】:2017-06-20 02:10:50 【问题描述】:

注意:我正在尝试创建一个可以处理一般范围的图像、方向和质量的过程,而不仅仅是这个图像。

我知道您可以使用凸包将一组点与多边形包围起来,并且您可以使用几种算法中的一种来为这些点创建一个最小边界框。但是,我想做类似于最小边界框的事情,但不将其限制为矩形。

说我有这张收据:

凸包:

最小边界框(旋转卡尺):

我的目标:(ms-paint):

正如您所见,最小边界框不太适用,因为收据从角度来看是一个梯形。这只会变得更糟,视角越低。我想要有 4 个点和尖角,所以我不能使用凸包。

有没有一种算法可以用来获得类似于凸包或最小边界框但限制为 4 个点和任何四边形形状的东西?

【问题讨论】:

为什么不用哈里斯角检测器?或者,使用您当前的算法,您可以拒绝凸包中的小线,并找到长线的交点。通过这两个端点,您可以找到交叉点using determinants。或者您可以保留凸包中的所有点并使用kmeans clustering 找到这 4 个点的中心并将其称为您的点。 查看我的回答here 以获取使用霍夫线进行交叉聚类的示例。我认为找到轮廓对于该图像可能会更好,然后像我在那个答案中那样拟合线条并找到交叉点。 @AlexanderReynolds 好主意。现在我生成轮廓,近似它们,凸包它们,然后寻找最小边界框。我不想使用凸包或轮廓的唯一原因是用于形状笨拙的收据,其中您的边缘非常圆润或翘曲。霍夫线是另一种选择,但我从文本中得到了数百行,即使在边缘检测之前进行了严重的模糊和平滑之后。如果我想改进它,那将是另一个问题。编辑那里的答案很好,看起来很有希望。 使用形态学操作使文本在找到轮廓之前虚拟消失。查看 Stack 上的一个很好的示例 here,除了你想做的所有事情。无论哪种方式,文本处理都可以帮助使那些霍夫线走上边界。并且可能有助于我假设您将要做的进一步处理。 【参考方案1】:

在处理色彩空间过滤和形态学运算后,我能够成功使用 Harris 检测器。您也可以使用交叉点来扩展它,就像我在 Hough Lines 中所做的 here 一样,这可能很有用,虽然有点冗长。这对于这个特定的图像效果很好,但对于管道来说,它需要很多参数(打开和关闭内核大小、迭代)。

我的实现是在 Python 中实现的,但这当然也可以在 C++ 或 Java 中工作:

import numpy as np
import cv2

# read image
img = cv2.imread('receipt.png')

# thresholding
blur = cv2.GaussianBlur(img, (5,5), 1)
hls = cv2.cvtColor(blur, cv2.COLOR_BGR2HLS)
low = np.array([0, 70, 0])
high = np.array([255, 255, 85])
thresh = cv2.inRange(hls, low, high)

# morphological operations to get the paper
kclose = np.ones((3,3), dtype=np.uint8)
kopen = np.ones((5,5), dtype=np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kclose, iterations=2)
opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kopen, iterations=6)

# corner detection
opening = cv2.GaussianBlur(opening, (3,3), 1)
opening = np.float32(opening)
dst = cv2.cornerHarris(opening, 2, 3, 0.04)

# drawing corners
dst = cv2.dilate(dst, None)
img[dst>0.01*dst.max()]=[0,0,255]

cv2.imshow('Corners', img)
cv2.waitKey(0)

这里是角落:

请注意,您会从 Harris 获得多个像素,因此如果您想在之后使用它们进行变形,则必须进行聚类以获得奇异角点。

我在图像上应用了来自色彩空间过滤、关闭和打开的蒙版,因此您可以在这些操作后看到蒙版。

过滤:

结束:

开幕式:

【讨论】:

谢谢亚历克斯!我现在正在经历这个。你为什么选择你所做的低/高颜色?这是任意的,特定于这个图像,还是一个标准?如果仅针对此图像,是否有一种方法可以尝试确定给定图像的低/高应该是多少? 完全针对此图像。如果没有具体的背景知识,尝试进行自动过滤通常非常困难。如果你正在开发一个可以在任何背景下工作的应用程序,这种方法就不是很健壮。您应该尝试不同的色彩空间,以了解每种色彩空间对应的白色和浅灰色。对于任意图像,使用您的原始方法更容易 - 轮廓并按照我在您问题的 cmets 中建议的方式跟随它们到角落。

以上是关于任何形状四边形的最小边界框或凸包?的主要内容,如果未能解决你的问题,请参考以下文章

具有六边形触摸边界的 Android Hexagon 形状按钮

从 Delaunay 三角剖分计算 alpha 形状的边界多边形

Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离

表示和描述

最小外接矩形的简介

谷歌地图边界多边形