OpenCV 비전 실무1장 · AI 비전과 OpenCV 개발환경19 / 22← 이전목차다음 →MetaContents

1장. AI 비전과 OpenCV 개발환경

실습 5 — OpenCV 맛보기: 과정 미리 보기

이 과정에서 배울 영상처리 세 가지를 한 줄씩 미리 돌려 봅니다. 흑백으로 바꾸기(3장), 흐리게 하기(6장), 테두리 찾기(11장)입니다. 지금은 함수가 무엇을 하는지만 보고, 자세한 원리는 해당 장에서 배웁니다.

1단계. 세 가지 처리를 한 줄씩

Python
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단계. 네 장을 한눈에 보기

Python
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()
원본, 흑백, 흐리게 한 그림, 테두리만 남긴 그림을 2행 2열로 놓은 결과

3단계. 테두리 결과를 숫자로 보고 저장하기

Python
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 두 값만 가지므로 흑백 두 색으로만 보입니다.
← 이전 절1장 · 실습 4 — Matplotlib 으로 그림 띄우기다음 절 →1장 · 프로젝트 1 — 수업 전 실습 PC 점검 스크립트