2장. 이미지 입출력과 영상 시각화
읽기 모드와 투명 채널
마트의 투명 스티커를 떠올려 봅시다. 스티커를 컬러 복사기에 넣으면 투명한 부분이 하얗거나 까맣게 칠해져 나옵니다. 흑백 복사기에 넣으면 색도 사라집니다. 스티커를 있는 그대로 갖고 싶으면 복사하지 말고 원본을 받아야 합니다. cv2.imread 의 읽기 모드가 이 세 가지 복사 방법입니다.
그림의 세 상자가 세 가지 읽기 모드입니다. 여기서 컬러 복사기가 IMREAD_COLOR, 흑백 복사기가 IMREAD_GRAYSCALE, 원본 그대로 받기가 IMREAD_UNCHANGED 입니다. 모드를 주지 않으면 컬러 복사기(IMREAD_COLOR)로 읽습니다.
두 번째 그림은 투명한 별 스티커를 IMREAD_UNCHANGED 로 읽어 나눠 본 것입니다. ①은 앞의 세 숫자(BGR)만 보인 것으로, 투명한 자리의 색 숫자는 0 이라 검게 보입니다. ②는 네 번째 숫자(알파)를 흑백으로 보인 것으로, 흰 곳(255)은 불투명하고 검은 곳(0)은 투명합니다. ③은 알파를 써서 체크무늬 바탕 위에 얹은 모습입니다. 별의 가장자리는 알파가 0 과 255 사이라 바탕이 살짝 비칩니다.
읽기 모드 세 가지
| 읽기 모드 | 원래 말 | 결과 모양 | 투명도 | 쓰는 때 |
|---|---|---|---|---|
cv2.IMREAD_COLOR (기본값) | image read color | (세로, 가로, 3) | 버린다 | 대부분의 컬러 처리 |
cv2.IMREAD_GRAYSCALE | gray scale(회색 눈금) | (세로, 가로) | 버린다 | 밝기만 쓰는 처리, 흑백 검사 |
cv2.IMREAD_UNCHANGED | unchanged(바꾸지 않은) | 저장된 그대로, 투명 png 는 (세로, 가로, 4) | 지킨다 | 투명 스티커, 흑백 png 를 흑백 그대로 |
import cv2
# 같은 파일을 세 모드로 읽어 모양을 견준다
for name, flag in [("COLOR", cv2.IMREAD_COLOR),
("GRAYSCALE", cv2.IMREAD_GRAYSCALE),
("UNCHANGED", cv2.IMREAD_UNCHANGED)]:
img = cv2.imread("ch02_sticker.png", flag)
print(f"{name:10}", img.shape)
# 결과: COLOR (160, 160, 3), GRAYSCALE (160, 160), UNCHANGED (160, 160, 4)IMREAD_UNCHANGED 로 읽은 투명 그림에서 알파만 꺼내려면 네 번째 칸(번호 3)을 고릅니다. img[:, :, 3] 은 "모든 줄, 모든 칸의 3번 숫자"라는 뜻입니다.
주의할 점
- JPG 는 투명도를 담지 못하므로
IMREAD_UNCHANGED로 읽어도 채널이 3개입니다. 4개를 기대하고img[:, :, 3]을 꺼내면 오류가 납니다.img.shape로 먼저 확인합니다. - BGRA 그림을 Matplotlib 으로 띄울 때는
cv2.COLOR_BGRA2RGBA로 바꿉니다.COLOR_BGR2RGB는 채널이 3개인 그림용입니다.