IT/언어

[python/openCV] 가로세로 비율을 유지한 채로 이미지를 리사이즈하기(이미지 사이즈 변경)

개발자 두더지 2022. 8. 8. 20:31
728x90

  이 포스팅은 일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 직역, 의역이 있을 수 있으며, 틀린 내용이 있으면 지적해주시면 감사하겠습니다.

 

 이번 포스트에서는 아래의 그림과 같이 해당 이미지의 가로, 세로 비율을 유치한 채로 지정 사이즈로 리사이즈하는 방법에 대해서 소개하도록 하겠다.

 

cv2.resize 메소드


 openCV의 resize의 메소드는 인수에 리사이즈 후의 이미지 사이즈(폭과 높이 튜플)을 지정해서 실행하는 메소드이다. 다만 이 메소드를 그대로 사용하면 지정한 사이즈대로 이미지를 변경해버린다. 예를 들자면 보면 다음과 같다.

size = (400, 300)
resized_image = image.resize(size)

 

 

가로 세로 비율을 유지하도록 리사이즈하는 방법


 앞서 설명했듯, 그냥 resize 메소드를 사용하면 지정한 사이즈로 이미지 사이즈를 변경해버리기 때문에, 직사각형과 같은 이미지의 경우 비율이 깨져버리는 문제가 발생한다. 

 그러나, "원래 이미지 사이즈이 가로 세로 비율"과 "리사이즈후의 이미지 가로 세율 비율이" 동일하게 조정해주면, 리사이즈 후의 이미지도 원래 이미지와 큰 변화없이 리사이즈 되게 된다.

 즉, 이미지의 가로 세율 비율을 유지되도록 리사이즈를 하기 위해서는 "원래 이미지 사이즈의 가로 세로 비율"과 인수로 지정하는 "리사이즈 후 이미지 사이즈의 가로 세율 비율"을 같게 하는 것이다(축소의 경우도 마찬가지).

 

 

예제 코드


 여기서 사용된 코드는 기본 이미지의 가로 세로 사이즈를 유지하도록 리사이즈 후, 여백을 까맣게 채우는 로직에 대한 것이다.

# 라이브러리 import 
import cv2
import numpy as np
import os
import glob

# 이미지 파일 목록을 취득(패스)
pics=glob.glob('*.jpg')

# 조정 후 사이즈를 지정(베이스 이미지)
size=(256,256)

# 리사이즈 처리
for pic in pics:
    base_pic=np.zeros((size[1],size[0],3),np.uint8)
    pic1=cv2.imread(pic,cv2.IMREAD_COLOR)
    h,w=pic1.shape[:2]
    ash=size[1]/h
    asw=size[0]/w
    if asw<ash:
        sizeas=(int(w*asw),int(h*asw))
    else:
        sizeas=(int(w*ash),int(h*ash))
    pic1 = cv2.resize(pic1,dsize=sizeas)
    base_pic[int(size[1]/2-sizeas[1]/2):int(size[1]/2+sizeas[1]/2),
    int(size[0]/2-sizeas[0]/2):int(size[0]/2+sizeas[0]/2),:]=pic1
    cv2.imwrite(new_fol+'/'+pic,base_pic)

참고자료

https://daeudaeu.com/pil-aspect/

https://www.higashisalary.com/entry/cv2-resize-aspect-ratio

728x90