1장. AI 비전과 OpenCV 개발환경
실습 5 — OpenCV 맛보기: 과정 미리 보기
이 과정에서 배울 영상처리 세 가지를 한 줄씩 미리 돌려 봅니다. 흑백으로 바꾸기(3장), 흐리게 하기(6장), 테두리 찾기(11장)입니다. 지금은 함수가 무엇을 하는지만 보고, 자세한 원리는 해당 장에서 배웁니다.
1단계. 세 가지 처리를 한 줄씩
import cv2
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Malgun Gothic"
plt.rcParams["axes.unicode_minus"] = False
img = cv2.imread("fruit_stand.png")
# 흑백으로 바꾸기: 숫자 세 개를 밝기 숫자 하나로 합친다
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 흐리게 하기: 칸마다 주변 9×9 칸의 값을 가중 평균한다. (9, 9) 는 주변 칸의 크기, 0 은 퍼짐 정도를 자동으로
blur = cv2.GaussianBlur(img, (9, 9), 0)
# 테두리 찾기: 밝기가 갑자기 바뀌는 곳을 흰색(255), 나머지를 검정(0)으로. 50, 150 은 약한·강한 경계의 기준값
edges = cv2.Canny(gray, 50, 150)
for name, arr in [("원본", img), ("흑백", gray), ("흐림", blur), ("테두리", edges)]:
print(f"{name:4} 모양 {arr.shape}")원본 모양 (240, 320, 3)
흑백 모양 (240, 320)
흐림 모양 (240, 320, 3)
테두리 모양 (240, 320)2단계. 네 장을 한눈에 보기
fig, axes = plt.subplots(2, 2, figsize=(8, 6))
# 컬러 그림은 RGB 로 바꿔서, 흑백 그림은 cmap="gray" 로 띄운다
panels = [
("원본", cv2.cvtColor(img, cv2.COLOR_BGR2RGB), None),
("흑백으로 바꾸기 (3차시)", gray, "gray"),
("흐리게 하기 (6차시)", cv2.cvtColor(blur, cv2.COLOR_BGR2RGB), None),
("테두리 찾기 (11차시)", edges, "gray"),
]
# axes.flat: 2×2 칸을 한 줄로 펴서 차례로 꺼낸다
for ax, (title, arr, cmap) in zip(axes.flat, panels):
ax.imshow(arr, cmap=cmap)
ax.set_title(title)
ax.axis("off")
plt.tight_layout()
plt.show()
3단계. 테두리 결과를 숫자로 보고 저장하기
import numpy as np
# 테두리 그림에 들어 있는 값의 종류: 0(검정)과 255(흰색)뿐인지 본다
print("들어 있는 값:", np.unique(edges))
# 흰 칸(테두리)이 전체에서 차지하는 비율. True 를 1 로 세어 평균을 낸다
ratio = float((edges > 0).mean())
print(f"테두리 칸의 비율: {ratio:.3f} ({ratio * 100:.1f}%)")
ok = cv2.imwrite("out_ch01_edges.png", edges)
print("저장:", ok)들어 있는 값: [ 0 255]
테두리 칸의 비율: 0.028 (2.8%)
저장: True코드 설명
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)는 컬러를 흑백으로 바꿉니다. 결과는 채널 칸이 없는 (240, 320) 모양입니다.cv2.GaussianBlur(img, (9, 9), 0)은 칸마다 주변 9×9 칸을 섞어 흐리게 합니다. Gaussian 은 이 섞는 비율을 정리한 수학자 가우스(Gauss)의 이름에서 왔습니다.cv2.Canny(gray, 50, 150)는 테두리만 흰색으로 남깁니다. 이 방법을 만든 존 캐니(John Canny)의 이름을 땄습니다.np.unique(edges)는 배열에 든 값의 종류를 작은 것부터 보여 줍니다. 테두리 그림은 0 과 255 두 값만 가지므로 흑백 두 색으로만 보입니다.