在python matplotlib中将不规则的四边形转换为矩形

时间:2015-10-22 14:09:31

标签: python matplotlib

我从视频中获得了这些数据。

  • 矩形的顶点
  • 在矩形内跟踪动物的点。

由于图像变形,我的“矩形”不规则。 我想转换数据,以便将它们作为矩形绘制在matplotlib中。

有简单的方法吗?

这是maze and trancking。我把它分解成五个四边形

2 个答案:

答案 0 :(得分:5)

您可以使用scikit-image中的skimage.transform.ProjectiveTransform将四边形内的坐标转换为局部方形空间[0,1]×[0,1]。

有关如何应用线性代数来解决此问题的更多信息,请参阅Paul Heckbert,1999年的ProjectiveTransform.estimate或“Projective Mappings for Image Warping”。

假设您的四边形的角是顺时针方向

bottom_left = [58.6539, 31.512]
top_left = [27.8129, 127.462]
top_right = [158.03, 248.769]
bottom_right = [216.971, 84.2843]

我们实例化一个ProjectiveTransform并要求它找到四边形内到单位平方的投影变换映射点:

from skimage.transform import ProjectiveTransform
t = ProjectiveTransform()
src = np.asarray(
    [bottom_left, top_left, top_right, bottom_right])
dst = np.asarray([[0, 0], [0, 1], [1, 1], [1, 0]])
if not t.estimate(src, dst): raise Exception("estimate failed")

现在,转换t已准备好将您的点转换为单位平方。当然,通过更改上面的dst,您可以缩放到不同于单位正方形的矩形(甚至可以缩放到完全不同的四边形)。

data = np.asarray([
    [69.1216, 51.7061], [72.7985, 73.2601], [75.9628, 91.8095],
    [79.7145, 113.802], [83.239, 134.463], [86.6833, 154.654],
    [88.1241, 163.1], [97.4201, 139.948], [107.048, 115.969],
    [115.441, 95.0656], [124.448, 72.6333], [129.132, 98.6293],
    [133.294, 121.731], [139.306, 155.095], [143.784, 179.948],
    [147.458, 200.341], [149.872, 213.737], [151.862, 224.782],
])
data_local = t(data)

我们绘制输入数据和转换后的数据,以查看转换的工作原理:

import matplotlib.pyplot as plt
plt.figure()
plt.plot(src[[0,1,2,3,0], 0], src[[0,1,2,3,0], 1], '-')
plt.plot(data.T[0], data.T[1], 'o')
plt.figure()
plt.plot(dst.T[0], dst.T[1], '-')
plt.plot(data_local.T[0], data_local.T[1], 'o')
plt.show()

Input data Result

答案 1 :(得分:0)

Here is a tool you can use for corner detection。请注意,在示例中,它们也处理变形和仿射变换。这是角点检测的基本示例。我假设你没有图像中矩形的坐标。

import matplotlib.pyplot as plt
from skimage.feature import corner_harris, corner_subpix, corner_peaks

image = plt.imread('test.jpg')

coords = corner_peaks(corner_harris(image), min_distance=2)
coords_subpix = corner_subpix(image, coords, window_size=13)

fig, ax = plt.subplots()
ax.imshow(image,cmap=plt.cm.gray)
ax.plot(coords[:,1],coords[:,0],'.b',markersize=5)
plt.title("Example of corner detection")
ax.axis((0,800,800,0))
plt.xlabel('x (pixels)')
plt.ylabel('y (pixels)')

这输出这个图像,你可以看到四边形是我的图像,而skimage找到了角落(蓝点):

corner detect

我会将转换变成一个由你决定的矩形。 AffineTransformation工具可以解决这个问题。它会将点移动以形成矩形。如果我在这方面取得任何进展,我将添加到帖子中。