본문 바로가기

Python

[Python] 6월 23일 cv2와 PIL 같이 쓰기

PIL과 cv2는 비슷한 기능을 하는 패키지이면서도 동작 방법은 너무 다르다. 예를들어 cv2는 numpy 배열로 읽고 처리하는 반면에 PIL은 이미지 그대로 처리한다. 그리고 cv2는 이미지를 BGR로 읽는 반면에 PIL은 이미지를 RGB로 처리한다. 그래서 두 패키지를 같이 쓰려면 변환 과정을 거쳐야한다. 그래서 하나의 편의를 위해 하나의 패키지만 주로 쓰려고 하지만 작업을 하다보면 어쩔 수 없이 두 패키지를 같이 사용해야 할 때가 있다. 특히 이미지에 텍스트를 써넣을때 cv2는 한글을 지원하지 않기 때문에 PIL로 한글 텍스트를 써넣고 cv2로 변환하여 시각화를 한다.(PIL로 다 해도 된다. 예를 들자면..)

 

방법을 설명하자면 1. PIL로 이미지를 불러온다. 2. PIL에 draw.text()를 사용하여 한글을 써넣는다. 3. array 배열로 변경하고 RGB -> BGR로 바꿔준다. 4. cv2를 사용하여 이미지에 시각화를 해준다. 5. 이미지를 저장해준다.

 

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

fontpath = 'fonts/gulim.ttc'

# 1. PIL로 이미지 불러오기
img = Image.open(image_path)
font = ImageFont.truetype(fontpath, 10)
draw = ImageDraw.Draw(img)
# 2. PIL로 텍스트 넣기
draw.text(...)
# 3. cv2로 변환
numpy_image = np.array(img)
cv_image = cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR)
# 4. cv2로 시각화
cv2.rectangle(...)
# 5. cv2로 저장
result, encoded_img = cv2.imencode('.png', cv_image)
if result:
with open(ouput_img, mode='w+b') as f:
	encoded_img.tofile(f)