이것저것 기록

[python, PIL] 직사각형에서 정사각형 이미지로 변환하기 본문

코린이/실무를 위한 코딩 기록

[python, PIL] 직사각형에서 정사각형 이미지로 변환하기

anweh 2020. 9. 21. 17:33

딥러닝이나 영상 처리를 하다보면 입력데이터로 정사각형을 넣어줘야 하는데, 내가 가진 데이터가 정사각형이 아닌 경우가 많다.

폴더 안의 수많은 데이터 중에서 정사각형이 아닌 이미지들만 뽑아서

정사각형의 이미지로 만들어 반환하려면 어떻게 해야할까? (이미지를 늘이지 않고) 

 

 

코드를 설명하기에 앞서, 이 작업에 필요한 라이브러리를 import해오자. 

import os
from PIL import Image

 

우선적으로 폴더 안의 파일들을 불러오자. 

os.chdir('폴더 경로') #해당 폴더로 이동
files = os.listdir(os.getcwd()) #현재 폴더에 있는 모든 파일을 list로 불러오기

 

 

해당 폴더로 이동 후에 '폴더 경로'안에 있는 모든 파일을 files라는 list에 불러왔다.

이 list안의 객체를 하나씩! PIL라이브러리의 Image함수를 통해 불러온 다음에 작업을 시작한다. 

for file in files:
	
    img = Image.open(file) #이미지 불러오기
    img_size = img.size #이미지의 크기 측정 
    	#직사각형의 이미지가 256x512 이라면, img_size = (256,512)가 된다.
    x = img_size[0] #넓이값
    y = img_size[1] #높이값
    
    if x != y: 
        size = max(x, y)    
        resized_img = Image.new(mode = 'RGB', size = (size, size), color = (채워주고 싶은 색))
        offset = (round((abs(x - size)) / 2), round((abs(y - size)) / 2))
        resized_img.paste(img, offset)
        resized_img.save(file + '_resized.png')
    
    

 

이미지를 늘이지 않고 정사각형으로 만드는 방법은 넓이와 높이 중 짧은 길이를 긴 길이에 맞추어 빈 곳을 채워주는 것이다. (이미지가 잘려도 상관 없다면 크롭하는 방법도 있긴 함. 나중에 포스팅할 예정)

다만 딥러닝의 입력데이터로 쓰이는 경우에는 빈 곳을 그냥 채워줄 수 없기 때문에 데이터의 배경색과 맞춰야한다. 

이미지 데이터의 배경색을 '채워주고 싶은 색' 부분에 RGB 값으로 넣으면 된다. 

 

 

왼쪽의 도면 이미지를 오른쪽의 정사각형 도면 이미지로 바꿨다.

배경색은 채워진 부분이 눈에 띄게 파란색으로 설정했음. 

 

 

Comments