Python OpenCV如何简单实现图像裁剪?

3

我有以下代码来裁剪图像的一部分:

import cv2

def on_mouse(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print("X: {} | Y: {}".format(x, y))

win_name = "Image"
cv2.namedWindow(win_name)
cv2.setMouseCallback(win_name, on_mouse)

img = cv2.imread('park.jpg')
cropImg = img[179:470, 511:645]

cv2.imshow(win_name, img)
cv2.imshow("Crop", cropImg)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,您可以看到我定义了一个名为on_mouse的函数调用,它基本上会在鼠标单击图像的任何位置时提供坐标(x,y)。这有助于获取我们想要裁剪的区域的x1,y1x2,y2坐标。在下面的图像中,我正在尝试裁剪giraffe区域。因此,我单击了靠近长颈鹿的左上角,这给了我坐标X: 470 | Y: 179,然后我单击了长颈鹿的右下角,这给了我坐标X: 645 | Y: 511。在使用它们进行上述代码时,输出如下:

enter image description here

以下是原始图像。

enter image description here

请问有人能帮我理解如何裁剪它,以及这些x1、y1和x2、y2表示什么?谢谢。

2个回答

4
他们设计的逻辑和你想象的不同。它看起来像这样:

cropImg = img[rowStart:rowEnd, colsStart:colsEnd]

它意味着你需要定义前两个对,即行起始结束坐标,这意味着Y轴坐标,然后是列起始结束坐标,这意味着X轴坐标。因此,您的代码中的行需要更改为:

cropImg = img[170:511,470:645]

您的结果将会变成这样:

在此输入图片描述


1
不知怎么的,这最终成为了我理解坐标的最佳方式,谢谢。 - Mariya Fetishcheva
不客气。像素级的事情很容易处理。 - Yunus Temurlenk

2

(x1, y1)是起始点的坐标,而(x2, y2)是图像中的结束点。在矩形中,您可以将它们视为左上角为(x1, y1),而(x2, y2)则为右下角 - 或者就像宽度和高度一样。

但在裁剪时,它们有一个略微相反的格式。

cropImage = image[ y1: y2 , x1: x2] 
# or
cropImage = image[ Y: H, X: W ] 

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