Python으로 영상과 색 다루기 · 학습

실행 조건

opencv-python-headless·NumPy·Matplotlib을 사용합니다. 카메라는 기본 활동에 필요하지 않습니다.

이번에 배울 내용

밝기·색·크기 변환이 검출에 필요한 정보를 어떻게 바꾸는지 눈과 배열 값으로 대조합니다.

전체 흐름

BGR 영상 → RGB·HSV → Mask → 중심 좌표

색상과 배열의 규칙

영상은 높이×너비×채널의 배열입니다. OpenCV는 BGR, Matplotlib은 RGB 채널 순서를 사용합니다.

OpenCV uint8 HSV의 H는 0…179, S·V는 0…255 범위라 다른 라이브러리의 HSV 값과 그대로 비교하면 안 됩니다.

색에서 영역과 좌표로

inRange는 정한 색 범위를 만족하는 픽셀을 Mask로 만듭니다. Mask의 행 Index는 y, 열 Index는 x입니다.

검출된 픽셀들의 평균 좌표로 중심을 구할 수 있지만, 여러 물체가 섞였거나 배경까지 검출되면 중심이 잘못될 수 있습니다.

MATLAB 영상과 Python 영상 연결하기

MATLAB의 rgb2hsv와 Python/OpenCV의 cvtColor는 색 정보를 바꾸는 같은 목적을 가집니다. MATLAB 영상은 RGB, OpenCV의 일반적인 카메라 배열은 BGR이며, 두 구현의 HSV 범위도 그대로 같다고 가정하면 안 됩니다.

같은 입력 영상의 색·Mask·중심 좌표를 대조합니다.

풀이 예제

120×160 BGR 영상에 파란 사각형을 그리고 RGB·Gray·HSV로 변환합니다.

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])
(120, 160, 3) uint8 [120 225 255]
실행 결과

공식 문서·데이터

참고 예제

추가 예제 보기

참고 자료