2015-04-08 2 views
0

Я действительно озадачен тем, как индексировать многомерный массив numpy. Моя цель - обрезать область из изображения, загруженного с помощью opencv. Загрузка изображений отлично работает:странное поведение при обрезке изображения 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) 

Я смущен, Что правильный способ индексации для операции урожая?

ответ

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 
0

Как уже упоминалось в других ответах вы могли бы использовать img[550:1550,-782:,:], но это даст вам только только вид на массив. Это означает, что вы не можете его изменить. Если вы хотите изменить изображение после его обрезки, вы можете использовать функцию Nump для индексации 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) 
Смежные вопросы