【问题标题】:What is an efficient way to crop out a slanted box from image?从图像中裁剪出倾斜框的有效方法是什么?
【发布时间】:2019-12-04 02:04:40
【问题描述】:

图片:

我有边界多边形的坐标(不是精确的矩形)。 如何有效地从图像中旋转和提取仪表?

array([[337, 300],
       [574, 348],
       [567, 378],
       [329, 337]], dtype=int32)

我已经能够将图像旋转

(h, w) = im.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(im, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

但这也改变了盒子的坐标。

预期输出:

【问题讨论】:

  • 一旦有了边界框轮廓,就可以使用 Numpy 切片来裁剪出所需的 ROI。看看this
  • 但盒子是倾斜的@nathancy
  • 哦,我看看它是否倾斜,那么有两种方法可以裁剪它。一是使用蒙版提取ROI,二是使用透视变换得到图像的鸟瞰图。这是一个很好的tutorial

标签: opencv computer-vision data-science


【解决方案1】:

我认为你想要一个有 4 个点的透视变换:

到这里:

#!/usr/bin/env python3

import cv2

# Set width and height of output image
W, H = 600, 200

# Load input image
img = cv2.imread('speedo.png')

# Define points in input image: top-left, top-right, bottom-right, bottom-left
pts0 = np.float32([[337,300],[574,348],[567,378],[329,337]])

# Define corresponding points in output image
pts1 = np.float32([[0,0],[W,0],[W,H],[0,H]])

# Get perspective transform and apply it
M = cv2.getPerspectiveTransform(pts0,pts1)
result = cv2.warpPerspective(img,M,(W,H))

# Save reult
cv2.imwrite('result.png', result)

您可以使用 ImageMagick 更简单地做同样的事情,它安装在大多数 Linux 发行版上,并且适用于 macOS 和 Windows。在终端或命令提示符中,您只需运行:

magick speedo.png -distort perspective '337,300 0,0 574,348 200,0 567,378 200,100 329,337 0,100' -crop 200x100+0+0 result.png

关键字:Python、命令行、shell、ImageMagick、OpenCV、扭曲、透视、扭曲、仿射、4 点、4 点、变换、图像、图像处理。

【讨论】:

  • 这正是我一直在寻找的,并且比其他流行的旋转和裁剪技术更容易和高效。谢谢大佬!
  • 如果盒子是一个精确的矩形,我们可以得到一个更简单的解决方案吗?
  • 很高兴它对您有用 - 请考虑通过单击计票旁边的空心对勾(复选标记)来接受它。
  • 如果框是一个精确的矩形,与图片边缘垂直或水平对齐,您可以只取图像的 Numpy 切片,例如speedo = image[10:100,80:200]
  • 它不与边缘对齐,而是处于倾斜位置。我有矩形的 4 个点,如何将它映射到您指定的直矩形,例如 pts1,即我需要子图像与边界框矩形的大小相同(不会像上面的输出那样失真)。
猜你喜欢
  • 2019-03-12
  • 2010-11-29
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2020-02-20
  • 2018-12-19
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多