使用 Python OpenCV 裁剪部分图像的简单方法是什么

What is the easy way to crop a part of image using Python OpenCV

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

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。在上面的代码中使用它们时,它给出以下输出

下图为原图

任何人都可以帮助我了解如何裁剪它以及这些 x1, y1 and x2, y2 表示什么?谢谢

他们设计的逻辑和你想象的不一样。看起来像:

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

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

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

你的结果会变成:

(x1,y1)为起点坐标,(x2,y2)为终点坐标。在矩形中,您可以将它们视为 top-left 角是 (x1, y1) 而 (x2, y2) 是 bottom-right 角 - 或者就像宽度和高度一样。

但是在裁剪时它们有一点反向格式

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