如何根据四个角的坐标来裁剪图片

5

我需要使用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)

参考图片

裁剪后的图片

谢谢。


1
我看到你打了 opencv 的标签,所以我假设你已经用它加载了你的图像。你可以直接使用切片操作:image[y1:y2, x1:x2] - Nullman
1
谢谢您的回复。我尝试了您的建议。我已经在帖子中附上了裁剪后的图像。切片效果很好,但是由于它不是一个完美的矩形,盘子的某些部分被遗漏了。有没有什么方法可以避免这种情况(也许使用所有4个坐标)?谢谢! - goutham r
你也可以查看这个链接 https://stackoverflow.com/questions/61178736/crop-image-from-four-corner-points-using-opencv-and-python,它是同样的内容,只是使用了不同的方法得到结果。 - Muneeb Ahmad Khurram
2个回答

6

由于你获得的坐标是一个多边形而不是矩形,所以需要在裁剪时进行一些调整,最简单的方法是调整你的矩形:

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]

1

如果你想裁剪车牌,可以在OpenCV中进行以下操作:

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

这里也有答案:如何使用Python和OpenCV裁剪图像

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

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

1
谢谢您的回复。我尝试了您的建议。我已经在帖子中附上了裁剪后的图像。切片效果很好,但是由于它不是一个完美的矩形,盘子的某些部分被遗漏了。有没有什么办法可以避免这种情况(也许使用所有4个坐标)?谢谢! - goutham r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接