2016-09-08 5 views
7

너비가 x이고 높이가 y 인 numpy 이미지가 있다고 가정 해 보겠습니다. 너비 cropx와 높이 cropy에 이미지의 가운데 부분을 잘라야합니다. cropx와 cropy가 양의 0이 아닌 정수이고 각각의 이미지 크기보다 작다고 가정 해 봅시다. 출력 이미지에 슬라이스를 적용하는 가장 좋은 방법은 무엇입니까? 이 라인을 따라농작물 가운데 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. 출력 이미지의 크기는 항상 동일합니까?

건배, 거트 사용할 수

+0

'//'대신'/'그들이 적어도 파이썬 3로 추측, 인덱싱 작동하지 않을 수 있습니다으로 PT 번호를 떠을 만드는 피하기 위해. x 버전. – Divakar

관련 문제