본문 바로가기

Python OpenCV

컬러 영상 처리와 색 공간

🙋‍♂️ 오늘은 컬러 영상 처리와 색 공간에 대한 공부한 내용을 정리합니다!

 OpenCV는 컬러 영상데이터의 경우 GrayScale 영상과 동일하게 numpy.ndarray로 표현하며

단, OpenCV에서는 RGB 순서가 아니라 BGR 순서를 기본적으로 사용하고 있습니다.

 

 예제 코드

 

import cv2
import numpy as np
 
# Color 영상을 불러오기 위해선 인자를 cv2.IMREAD_COLOR로 설정
img1 = cv2.imread('lenna.bmp', cv2.IMREAD_COLOR)
 
# 영상 전체를 0값으로하는 컬러 영상을 만들고 컬러 영상위에 도형 그리기
img2 = np.zeros((4806403), np.uint8)
pts = np.array([[250200], [300200], [350300], [250300]])
cv2.polylines(img2, [pts], True, (2550255), 2)
 
# 이미지를 GrayScale로 Read 후 cvtColor로 변경시 컬러의 정보는 없지만
# 컬러 영상이기때문에 컬러 도형을 그릴 수있음
img3 = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)
img4 = cv2.cvtColor(img3, cv2.COLOR_GRAY2BGR)
cv2.circle(img4, (300100), 30, (2552550), 2, cv2.LINE_AA)
 
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img4', img4)
 
cv2.waitKey()
 
cv2.destroyAllWindows()
cs

 

🖼️ 결과 이미지

 

 예제 코드 (BGR 분할)

 

import sys
import numpy as np
import cv2
 
 
# 컬러 영상 불러오기
src = cv2.imread('candies.png', cv2.IMREAD_COLOR)
 
if src is None:
    print('Image load failed!')
    sys.exit()
 
# 컬러 영상 속성 확인
print('src.shape:', src.shape)  # src.shape: (4806403)
print('src.dtype:', src.dtype)  # src.dtype: uint8
 
# RGB 색 평면 분할
planes = cv2.split(src)
 
#b_plane = src[:, :, 0]
#g_plane = src[:, :, 1]
#r_plane = src[:, :, 2]
 
cv2.imshow('src', src)
cv2.imshow('B_plane', planes[0])
cv2.imshow('G_plane', planes[1])
cv2.imshow('R_plane', planes[2])
cv2.waitKey()
 
cv2.destroyAllWindows()
cs

 

🖼️ 결과 이미지

 

일반적으로 Color영상 처리할 때는 BGR이 아닌 HSV, YCrCb, LAB 등의 형태로 변환하여 처리합니다.

RGB → GrayScale로 변환의 경우 " Y= 0.299R + 0.587 + 0.144B "의 수식을 사용합니다.

장점: 데이터 저장 용량 감소, 데이터 처리 속도 향상

단점: 색상 정보 손실

 

HSV 색 공간과 값의 범위는 아래와 같이 표현합니다.

 

 예제 코드 (HSV 분할)

 

import sys
import numpy as np
import cv2
 
# 컬러 영상 불러오기
src = cv2.imread('candies.png', cv2.IMREAD_COLOR)
 
if src is None:
    print('Image load failed!')
    sys.exit()
 
# HSV 색 평면 분할
src_HSV = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
HSVplanes = cv2.split(src_HSV)
 
cv2.imshow('src', src)
cv2.imshow('H_plane', HSVplanes[0])
cv2.imshow('S_plane', HSVplanes[1])
cv2.imshow('V_plane', HSVplanes[2])
cv2.waitKey()
 
cv2.destroyAllWindows()
cs

 

🖼️ 결과 이미지

 

본 학습 내용은 "OpenCV를 활용한 컴퓨터비전과 딥러닝" 을 참고하였음을 알려드립니다.

'Python OpenCV' 카테고리의 다른 글

특정 색상 영역 추출하기  (0) 2024.02.09
히스토그램 분석  (0) 2024.02.09
OpenCV 그리기 함수  (0) 2024.02.04
마스크 연산과 ROI  (0) 2024.01.26
영상의 생성, 복사, 부분 영상 추출  (0) 2024.01.22