본문 바로가기
소프트웨어/파이썬

[파이썬] 이미지 전처리 - 정사각형으로 만들기

by 만들오 2021. 1. 23.

안녕하세요? 만들오 입니다.

 

머신러닝으로 이미지를 학습하기 위해서는 전처리(preprocessing)과정이 필수입니다.

학습코드보다 전처리 과정이 더 어려운 현실입니다...

오늘은 대부분의 네트워크가 정사각형의 이미지를 원하기 때문에 잘라주는 코드를 작성했습니다.

 

타입을 2종류로 구분해 보았습니다.

1. 중심 기준으로 자르기(짧은쪽 이미지가 삭제됨)

2. 짧은쪽을 채우고, 중심 기준으로 자르기(짧은쪽 이미지 보존됨)

 

대부분은 2번 타입을 쓰겠지만 간혹 액자모양이든 잘라야할 때가 있어서 기록하기로 했습니다.

 

1. 중심 기준으로 자르기

numpy 형식 및 PIL 형식 모두 사용 가능하도록 했습니다.

import numpy as np
def crop_center(img):
    if type(img) == np.ndarray:
        #print('USE Numpy') 
        y, x, c = img.shape
        sx = x // 2-(min(x, y) // 2)
        sy = y // 2-(min(x, y) // 2)
        img = img[sy:sy+min(x,y), sx:sx+min(x,y)]
    else:
        #print('Use PIL')
        x, y = img.width, img.height
        sx = x // 2-(min(x, y) // 2)
        sy = y // 2-(min(x, y) // 2)
        img = img.crop((sx, sy, sx+min(x, y), sy+min(x, y)))
    return img

 

2. 짧은쪽을 채우고, 중심 기준으로 자르기

 PIL 형식만 지원합니다. keras.preprocessing.image.load_img 혹은 PIL로 불러오면 사용 가능합니다.

from PIL import ImageOps
def make_square(img, size):
    border_size = abs(img.width - img.height)
    k = max(img.width, img.height)
    img_bordered = ImageOps.expand(img, border=border_size, fill='black')
    w = img_bordered.width
    h = img_bordered.height
    img_squared = img_bordered.crop((w//2-k//2, h//2-k//2, w//2+k//2, h//2+k//2))
    return img_squared.resize(size)

* 이 글은 티스토리 카카오계정 연동정책으로 인해 이전 블로그(오코취) 글을 옮겨왔습니다.

[].

728x90

댓글