파이썬 영상 처리 라이브러리하면 딱 떠오르는 것은 바로 opencv-python입니다. 그래서 이미지에 텍스트를 삽입할 때도 cv2.imread 함수로 이미지를 읽은 다음에 cv2.putText 함수로 텍스트를 삽입하곤 합니다. 하지만, cv2.putText 함수로 한글 텍스트를 삽입하는 경우 한글이 깨집니다. 하지만 저희는 한국인이라, 이미지에 한글을 불가피하게 넣어야 하는 경우가 많은데 어떻게 해야할까요?
이미지에 한글 텍스트 삽입하는 방법
방법은 pillow 라이브러리를 활용하는 것입니다. pillow 역시 opencv 못지 않게 널리 사용되는 영상 처리 라이브러리 중 하나입니다. 저는 opencv로 이미지를 읽은 다음에 그 이미지를 pillow 이미지로 변환한 후 한글 텍스트를 추가하고 다시 opencv에서 사용 가능한 numpy 배열의 형태로 이미지를 변환하도록 하겠습니다.
1. cv2 이미지를 pillow 이미지로 변환
먼저 cv2 이미지를 pillow 이미지로 변환할 때는 pillow 라이브러리의 Image.fromarray()를 사용할 수 있습니다.
- [python] cv2 이미지를 pillow 이미지로 변경하기, Image.fromarray()
img_pillow = Image.fromarray(img_cv2)
2. 텍스트 삽입 (한글 안 깨짐)
그 다음에 텍스트를 삽입할 때는 다음과 같은 코드가 필요합니다.
fontpath = "fonts/gulim.ttc"
font = ImageFont.truetype(fontpath, 24)
b,g,r,a = 0,0,255,255 # 빨간색 글자
draw = ImageDraw.Draw(img_pillow, 'RGBA')
draw.text((200, 70), "텍스트를 삽입합니다", font=font, fill=(b,g,r,a))
draw.text() 에서 (200, 70)은 텍스트가 삽입될 위치를 뜻합니다. 이미지 상에서 x, y 좌표 (200, 70)에 텍스트를 삽입해달라는 뜻입니다. 텍스트의 좌측 상단 좌표가 (200, 70)이 되는 것입니다. 아래 참고 이미지를 보시면 이해가 되실 것입니다.
3. pillow 이미지를 cv2 이미지로 변환
마지막으로 pillow 이미지를 다시 cv2 이미지로 변환해주는 코드는 다음과 같습니다.
img_cv2 = np.array(img_pillow)
전체 코드
관련된 코드를 모두 합치면 다음과 같습니다.
import cv2
from PIL import Image, ImageFont, ImageDraw
import numpy as np
img_cv2 = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
img_pillow = Image.fromarray(img_cv2)
fontpath = "fonts/gulim.ttc"
font = ImageFont.truetype(fontpath, 24)
b,g,r,a = 0,0,255,255
draw = ImageDraw.Draw(img_pillow, 'RGBA')
draw.text((200, 70), "텍스트를 삽입합니다.", font=font, fill=(b,g,r,a))
img_numpy = np.array(img_pillow)
위 코드를 정상적으로 실행하시려면 opencv-python 라이브러리와 pillow 라이브러리는 당연히 설치해주셔야 합니다. 그리고 test.jpg도 준비해주셔야 합니다. 위 코드는 윈도우 PC에서 정상적으로 실행되는 코드입니다. 리눅스 PC에서는 폰트 경로 등 조금의 수정이 필요합니다.
'Dev > python' 카테고리의 다른 글
[python] 010-1234-5678과 같은 전화번호 문자열에서 하이픈(-) 빼기 (0) | 2022.09.21 |
---|---|
[python] 클래스(class), 객체(object), 인스턴스(instance) 용어 정리 (0) | 2022.09.21 |
[python] SQLAlchemy로 데이터 조회하는 방법, fetchall() (0) | 2022.09.07 |
[python] 딕셔너리 키 리스트, 값 리스트 생성하기 (7) | 2022.09.06 |
[flask] Ajax로 json 데이터 post 전달시 flask 서버 get_json() 관련 오류 해결 방법 (0) | 2022.08.29 |
[python] 함수를 매개변수로 전달할 때 많이 사용되는 람다(lambda) (2) | 2022.08.23 |
[pandas] SQL의 JOIN 역할을 하는 pd.merge와 df.join (0) | 2022.08.15 |
[pandas] 파이썬 판다스로 엑셀 파일을 읽고 쓰려면 openpyxl도 추가로 설치해야 함 (0) | 2022.08.15 |