算法 – 任何形状四边形的最小边界框或凸壳?

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

我知道你可以使用凸包来用一个多边形包围一组点,你可以使用几种算法之一为这些点创建一个最小边界框.但是,我想做与最小边界框类似的操作,但不限制为矩形.

说我有这张收据:

enter image description here

凸壳:

enter image description here

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

enter image description here

我的目标:(ms-paint):

enter image description here

正如您所看到的那样,最小边界框不太合适,因为从收视角度来看收据是一个梯形.只有视角越低,这种情况才会越糟.我想要有4个点和尖角,所以我不能使用凸包.

是否有一种算法可以用来获得类似于凸包或最小边界框的东西,但限于4个点,以及任何四边形?

最佳答案
随着一些颜色空间过滤和形态学操作的混乱,我能够成功地使用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)

这是角落:

Corners

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

我从图像颜色空间过滤,关闭和打开应用了蒙版,以便您可以在这些操作之后看到蒙版.

过滤:

Filtering

收盘:

Closing

开幕式:

Opening

转载注明原文:算法 – 任何形状四边形的最小边界框或凸壳? - 代码日志