我对索引numpy多维数组的方式感到很困惑。我的目标是从使用opencv加载的图像中裁剪区域。 加载图片效果很好:
import numpy as np
import cv2
img = cv2.imread(start_filename)
print img.shape
形状显示为
(2000L, 4096L, 3L)
现在我想从图像中剪切一部分,其范围从第一维中的像素550到1550,并且仅包括第二维的最后782个像素。我试过了
img=img[550:1550][:-782][:]
print img.shape
现在形状显示为
(782L, 4096L, 3L)
我很困惑,为作物操作编制索引的正确方法是什么?
答案 0 :(得分:1)
裁剪图像的正确方法是使用切片技术:
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]
在您的情况下,最终裁剪的图像可能会被复制为:
crop_img=img[550:1550, -782:]
print crop_img.shape
答案 1 :(得分:0)
如其他答案中所述,您可以使用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))]
在此之后,您的形状将如下所示:
(1000, 782, 3)