2016-09-08 4 views
7

Предположим, у меня есть несколько изображений с шириной x и высотой y. Мне нужно обрезать центральную часть изображения до ширины cropx и высоты. Предположим, что cropx и урожайность - положительные целые числа, отличные от нуля, и меньше соответствующего размера изображения. Каков наилучший способ применения среза для выходного изображения?часть центра обрезки изображения numpy

ответ

11

Что-то вдоль этих линий -

def crop_center(img,cropx,cropy): 
    y,x = img.shape 
    startx = x//2-(cropx//2) 
    starty = y//2-(cropy//2)  
    return img[starty:starty+cropy,startx:startx+cropx] 

Пример запуска -

In [45]: img 
Out[45]: 
array([[88, 93, 42, 25, 36, 14, 59, 46, 77, 13, 52, 58], 
     [43, 47, 40, 48, 23, 74, 12, 33, 58, 93, 87, 87], 
     [54, 75, 79, 21, 15, 44, 51, 68, 28, 94, 78, 48], 
     [57, 46, 14, 98, 43, 76, 86, 56, 86, 88, 96, 49], 
     [52, 83, 13, 18, 40, 33, 11, 87, 38, 74, 23, 88], 
     [81, 28, 86, 89, 16, 28, 66, 67, 80, 23, 95, 98], 
     [46, 30, 18, 31, 73, 15, 90, 77, 71, 57, 61, 78], 
     [33, 58, 20, 11, 80, 25, 96, 80, 27, 40, 66, 92], 
     [13, 59, 77, 53, 91, 16, 47, 79, 33, 78, 25, 66], 
     [22, 80, 40, 24, 17, 85, 20, 70, 81, 68, 50, 80]]) 

In [46]: crop_center(img,4,6) 
Out[46]: 
array([[15, 44, 51, 68], 
     [43, 76, 86, 56], 
     [40, 33, 11, 87], 
     [16, 28, 66, 67], 
     [73, 15, 90, 77], 
     [80, 25, 96, 80]]) 
1

Спасибо, Divakar.

Ваш ответ заставил меня двигаться в правильном направлении. Я придумал это, используя отрицательные смещения ломтика считать «с конца»:

def cropimread(crop, xcrop, ycrop, fn): 
    "Function to crop center of an image file" 
    img_pre= msc.imread(fn) 
    if crop: 
     ysize, xsize, chan = img_pre.shape 
     xoff = (xsize - xcrop) // 2 
     yoff = (ysize - ycrop) // 2 
     img= img_pre[yoff:-yoff,xoff:-xoff] 
    else: 
     img= img_pre 
    return img 

Несколько вещей, которые я не уверен.

  1. Будет ли это работать с нечетными размерами изображения и/или значениями культур?
  2. Будут ли выходные изображения одинакового размера?

Cheers, Герт

+0

Вы можете использовать '' // вместо '/', чтобы избежать их числа с плавающей пт, поскольку они могут не работать для индексирования, по крайней мере, я думаю, с Python 3. х версий. – Divakar