Python으로 영상과 색 다루기
학습 목표
밝기·색·크기 변환이 검출에 필요한 정보를 어떻게 바꾸는지 눈과 배열 값으로 대조합니다.
실행 조건
opencv-python-headless·NumPy·Matplotlib을 사용합니다. 카메라는 기본 활동에 필요하지 않습니다.
배열에서 영상으로
시작 조건
120×160 BGR 영상에 파란 사각형을 그리고 RGB·Gray·HSV로 변환합니다.
진행 방법
- 원본 배열의 shape·dtype·범위를 확인하세요.
- 같은 영상을 Matplotlib에 올바르게 표시하고 채널 순서를 일부러 바꾼 결과와 비교하세요.
남길 결과
- 표현별 비교 그림과 배열 요약.
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
image=np.full((120,160,3),220,dtype=np.uint8);image[30:90,50:110]=(255,30,30)
rgb=cv.cvtColor(image,cv.COLOR_BGR2RGB);hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
fig,axes=plt.subplots(1,2);axes[0].imshow(image);axes[0].set_title('BGR as RGB');axes[1].imshow(rgb);axes[1].set_title('Correct RGB')
print(image.shape,image.dtype,hsv[60,80])
결과 기록·자가 점검
표현:
shape:
dtype·값 범위:
해석:
확인할 점
- BGR 배열을 RGB처럼 표시하지 않았는가?
- OpenCV의 uint8 HSV에서 H가 0…179임을 확인했는가?
색 범위로 물체 찾기
시작 조건
파랑 HSV 범위 …130, S≥80, V≥50을 사용합니다.
진행 방법
- inRange로 Mask를 만들고 원본 옆에 표시하세요.
- 영상 밝기를 낮춘 뒤 같은 기준으로 영역을 찾으세요.
- 잡음 또는 색이 비슷한 배경을 하나 추가해 어떤 오류가 생기는지 확인하세요.
남길 결과
- 원본·Mask 비교 그림과 조건별 검출 표.
mask=cv.inRange(hsv,np.array([100,80,50]),np.array([130,255,255]))
plt.figure();plt.imshow(mask,cmap='gray');print(np.count_nonzero(mask))
# TODO: 밝기·배경 조건을 바꿔 비교하세요.
결과 기록·자가 점검
조건:
검출 픽셀 수:
놓친 영역:
잘못 검출한 영역:
확인할 점
- RGB와 HSV의 채널 의미를 섞지 않았는가?
- 검출 픽셀 수만으로 정확도를 평가하지 않았는가?
좌표를 다음 단계로 넘기기
시작 조건
Mask에서 검출한 영역의 중심을 pixel 좌표로 계산합니다.
진행 방법
- 행·열 Index와 x·y 좌표의 관계를 적으세요.
- 영상에 중심점을 겹쳐 그려 좌표가 맞는지 확인하세요.
- 영역이 하나도 없을 때 반환할 값을 정하세요.
남길 결과
- 중심 표시 그림과 미검출 처리 예.
yy,xx=np.nonzero(mask)
center=None if len(xx)==0 else (float(xx.mean()),float(yy.mean()))
print(center)
# TODO: 중심을 영상에 겹쳐 그리세요.
결과 기록·자가 점검
상황:
중심 x:
중심 y:
검출 유효 여부:
확인할 점
- 0,0을 미검출로 쓰면서 실제 왼쪽 위 물체와 혼동하지 않았는가?
- 행이 y, 열이 x라는 관계를 유지했는가?