2017-01-22 1 views
2

자르기를 원하는 많은 이미지가 있습니다. 그럼 난 것처럼 내 이미지를 처리하기 위해 함께 두 가지 기능을 체인 것PIL을 사용하여 이미지 재구성 및 자르기를 벡터화

def crop_images(images_data): 
    cropped_images = [] 
    for image_data in images_data: 
     image = Image.fromarray(image_data) 
     cropped_image = np.asarray(image.crop((25,40,275,120))) 
     cropped_images.append(cropped_image) 
    return(np.array(cropped_images)) 

def resize_images(images_data): 
    resized_images = [] 
    width, height = images_data.shape[2], images_data.shape[1] 
    resized_width, resized_height = int(width/2), int(height/2) 
    for image_data in images_data: 
     image = Image.fromarray(image_data) 
     image = image.resize((resized_width, resized_height), Image.ANTIALIAS) 
     resized_images.append(np.asarray(image)) 
    return(np.array(resized_images)) 

: resize_images(crop_images(images_data))

하지만 내가 할 수있는 방법이 있는지 궁금 해서요 내가 두 도우미 함수를 쓴이 좀 도와 numpy이 이상적으로 벡터화 된 연산을 수행해야한다는 것을 알고 있으므로 이러한 연산을 벡터화하십시오. 당신은 하나의 3 차원 배열에 모든 이미지를 넣어 경우, 당신은 한 번에 모두를자를 수 있습니다 자르기

+0

같은 모양으로 자릅니다. 그렇다면 이미 초기화하지 않은 경우 초기화 된 출력 배열을 사용하는 것이 좋습니다. – Divakar

+0

이 경우 이미지 라이브러리를 사용하여 자르기 대신 numpy를 사용하여 자르기가 더 최적 인 것처럼 보입니다. – physicalattraction

답변

1

이것은 이미지 배열보다 높은 수준의 반복입니다. '벡터화'에 대한 일반적인 이야기는 해당 사항이 아닙니다.

이미지 배열은 (400,400,3) 이상인 경향이 있습니다. 할 필요가 없다면 400면 중 하나를 반복하고 싶지는 않을 것입니다. 따라서 이미지 배열에 대한 '벡터화'작업은 많은 의미가 있습니다.

그러나 이러한 이미지를 100 개 처리하면 이미지 위로 반복문이 너무 나쁘지 않습니다. '벡터화'하는 유일한 방법은 큰 배열 (N, 400, 400, 3)로 어셈블하고 4d에서 작동하는 표현식 또는 그 큰 조각을 찾는 것입니다. N이 1000 이상이면 그 경로를 유혹하지만, 메모리 관리 문제와 같은 큰 배열에 대해서는 속도 향상에 씹기 시작합니다.

반복을 위해 목록에 추가하고 미리 할당 된 배열에 삽입하는 것이 유용 할 것이라고 생각합니다. 모든 경우에 하나가 다른 것보다 빠르다는 명확한 증거를 보지 못했습니다. '벡터화'일괄 작업 할 때

alist = [] 
for arr in source: 
    <process arr> 
    alist.append(arr) 
bigarr = np.array(alist) 

bigarr = np.zeros((N,..) 
for i in range(N): 
    arr = source[i,...] 
    <process arr> 
    bigarr[i,...] = arr 

대 코드 선명도도 고통을 수 있습니다.

+0

많은 감각을 만들어 줘서 고마워. – YellowPillow

1

은 (세 번째 차원 이미지 축입니다) : 그 것이다 경우

cropped = images[top:bottom, left:right, :] 

확실하지 않음 더 빨리 - 메모리에 모든 이미지를 두 번 저장하는 데 드는 메모리 비용으로 인해 속도가 느려질 수 있습니다.

+0

또한 이것들이 뷰일 것이므로 훨씬 더 좋아야합니다. PIL이 자르기에 익숙하지 않습니다. – Divakar

+0

오른쪽! 그들이보기를 잊었다 :) – lolopop