【问题标题】:How do I crop an image given the coordinates of the four corners to crop给定要裁剪的四个角的坐标,如何裁剪图像
【发布时间】:2019-07-19 22:11:22
【问题描述】:

在给定车牌边界框坐标的情况下,我需要使用 python 从汽车图像中裁剪车牌。 (4 个坐标)。关于我如何做到这一点的任何提示?

我有以下代码,但没有按预期工作。

> x1, y1: 1112 711 
> x2, y2: 1328 698 
> x3, y3: 1330 749 
> x4, y4: 1115 761
image = cv2.imread(IMAGE_PATH)
fixed_image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)

new_img = cv2.rectangle(fixed_image, (x3,y3), (x1,y1), (0, 255, 0), 5) 

plt.figure(figsize=(12,13))
plt.imshow(new_img)

Image for reference

Cropped image

谢谢。

【问题讨论】:

  • 我看到你标记了opencv,所以我假设你用它加载了你的图像。你可以只做切片:image[y1:y2, x1:x2]
  • 感谢您的回复。我尝试了这个建议。我在帖子中附上了裁剪后的图像。切片有效,但盘子的某些部分被遗漏了,因为它不是一个完美的矩形。有什么办法可以避免这种情况(也许使用所有 4 个坐标)?谢谢!
  • 你也可以看看stackoverflow.com/questions/61178736/…,是一样的,只是结果的方法不同。

标签: python opencv matplotlib image-processing crop


【解决方案1】:

由于您获得的坐标是 POLYGON 而不是 RECTANGLE,因此您必须对切片进行一些调整,最简单的方法是调整矩形:

x1,y1:1112 711
x2, y2: 1328 698
x3, y3: 1330 749
x4, y4: 1115 761

top_left_x = min([x1,x2,x3,x4])
top_left_y = min([y1,y2,y3,y4])
bot_right_x = max([x1,x2,x3,x4])
bot_right_y = max([y1,y2,y3,y4])

现在可以了

img[top_left_y:bot_right_y, top_left_x:bot_right_x]

请注意,切片不包括终点,因此您可能想要这样做

img[top_left_y:bot_right_y+1, top_left_x:bot_right_x+1]

【讨论】:

    【解决方案2】:

    在 OpenCV 中,如果要裁剪图版,可以执行以下操作

    import cv2
    img = cv2.imread("image.png")
    cropped__img = img[y1:y2, x1:x2]
    

    也在这里回答: How to crop an image in OpenCV using Python

    或将像素的颜色更改为白色或黑色(或任何其他颜色)。

    import cv2
    img = cv2.imread("image.png")
    img[y1:y2, x1:x2] = [255,255,255]
    

    【讨论】:

    • 感谢您的回复。我尝试了这个建议。我已在帖子中附加了裁剪后的图像。切片有效,但盘子的某些部分被遗漏了,因为它不是一个完美的矩形。有什么办法可以避免这种情况(也许使用所有 4 个坐标)?谢谢!
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2016-12-09
    相关资源
    最近更新 更多