裁剪numpy/opencv图像时的奇怪行为

2024-04-26 18:42:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我真的对多维数组的索引方式感到困惑。我的目标是从使用opencv加载的图像中裁剪一个区域。 加载图像效果很好:

import numpy as np
import cv2
img = cv2.imread(start_filename)
print img.shape

形状显示为

^{pr2}$

现在我想从图像中切割出一部分,它在第一维度的像素范围是550到1550,并且只包含第二维度的最后782个像素。我试过了

img=img[550:1550][:-782][:]
print img.shape

现在形状显示为

(782L, 4096L, 3L)

我很困惑,什么是正确的方法索引作物操作?在


Tags: 图像importnumpy区域目标img方式像素
2条回答

裁剪图像的正确方法是使用切片技术:

import cv2
img = cv2.imread("lenna.png")
crop_img = img[200:400, 100:300] # Crop from x, y, w, h -> 100, 200, 300, 400
# NOTE: its img[y: y + h, x: x + w] and *not* img[x: x + w, y: y + h]

在您的情况下,最后裁剪的图像可以复制为:

^{pr2}$

正如在其他答案中提到的,您可以使用img[550:1550,-782:,:],但这只会给您一个数组的只读视图。这意味着你不能修改它。如果要在裁剪后修改图像,可以使用Numpy的ix_函数来索引。在

img=img[ix_(range(550, 1550), range(img.shape[1]-782, img.shape[1]))]
# or
img=img[ix_(range(550, 1550), range(img.shape[1]-782, img.shape[1]), range(3))]

在此之后,您的形状将如下所示:

^{pr2}$

相关问题 更多 >