😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[v0.9]μ˜μƒμ²˜λ¦¬_OpenCV_이미지 μƒ‰μƒν‘œν˜„λ°©μ‹(BGR, HSV, YUV) λ³Έλ¬Έ

πŸ‘©‍πŸ’» IoT (Embedded)/Image Processing

[v0.9]μ˜μƒμ²˜λ¦¬_OpenCV_이미지 μƒ‰μƒν‘œν˜„λ°©μ‹(BGR, HSV, YUV)

μ§•μ§•μ•ŒνŒŒμΉ΄ 2021. 12. 30. 16:04
728x90
λ°˜μ‘ν˜•

211230 μž‘μ„±

<λ³Έ λΈ”λ‘œκ·ΈλŠ” 귀퉁이 μ„œμž¬λ‹˜μ˜ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•΄μ„œ κ³΅λΆ€ν•˜λ©° μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€>

https://bkshin.tistory.com/entry/OpenCV-7-%E3%85%87%E3%85%87?category=1148027 

 

OpenCV - 7. 이미지 색상 ν‘œν˜„ 방식(BGR, HSV, YUV)

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” OpenCV둜 색상을 ν‘œν˜„ν•˜λŠ” 방식에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ… μ—­μ‹œ '파이썬으둜 λ§Œλ“œλŠ” OpenCV ν”„λ‘œμ νŠΈ(μ΄μ„Έμš° μ €)'λ₯Ό μ •λ¦¬ν•œ κ²ƒμž„μ„ λ°νž™λ‹ˆλ‹€. μ½”λ“œ: github.com/BaekKyunShin/

bkshin.tistory.com

 

 

 

 

1. BGR, BGRA

1) RGB

: 색상은 0~2255 μ‚¬μ΄μ˜ κ°’μœΌλ‘œ ν‘œμ‹œ

: 값이 컀질수둝 ν•΄λ‹Ή μƒ‰μƒμ˜ 빛이 밝아진닀

: OpenCVλŠ” λ°˜λŒ€ μˆœμ„œ BGR 둜 ν‘œν˜„

 

2) BGRA

: RGB에 A(alpha) κ°€ μΆ”κ°€λœ μƒ‰μƒν‘œκΈ°λ²•

: AλŠ” 배경의 투λͺ…도 (0~255 μ‚¬μš©ν•˜μ§€λ§Œ, 0 : 검은색, 255 : 흰색 으둜 주둜 μ“°μž„)

 

cv2.imread() ν•¨μˆ˜μ— 

: cv2.IMREAD_COLORλ₯Ό λ„£μ–΄μ£Όλ©΄ BGR λ°©μ‹μœΌλ‘œ 이미지λ₯Ό 읽기

: cv2.IMREAD_UNCHANGED인 경우 이미지가 μ•ŒνŒŒ 채널을 가지고 μžˆλŠ” 경우 BGRA λ°©μ‹μœΌλ‘œ 읽기

# BGR, BGRA, Ahlpha 채널

import cv2
import numpy as np

# κΈ°λ³Έ κ°’ μ˜΅μ…˜
img = cv2.imread('img/opencv_logo.png')   
# IMREAD_COLOR μ˜΅μ…˜                   
bgr = cv2.imread('img/opencv_logo.png', cv2.IMREAD_COLOR)    
# IMREAD_UNCHANGED μ˜΅μ…˜
bgra = cv2.imread('img/opencv_logo.png', cv2.IMREAD_UNCHANGED) 
# 각 μ˜΅μ…˜μ— λ”°λ₯Έ 이미지 shape
print("default", img.shape, "color", bgr.shape, "unchanged", bgra.shape) 

cv2.imshow('bgr', bgr)
cv2.imshow('bgra', bgra)
cv2.imshow('alpha', bgra[:,:,3])  # μ•ŒνŒŒ μ±„λ„λ§Œ ν‘œμ‹œ
cv2.waitKey(0)
cv2.destroyAllWindows()

default (120, 98, 3) color (120, 98, 3) unchanged (120, 98, 4)  -> ALPHA 채널 더 μžˆμ–΄μ„œ shape 4둜 λ³€κ²½

μ•ŒνŒŒμ±„λ„ = 마슀크 채널

&nbsp;BGRA&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ALPHA&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BGA

 

 

 

2. BGR 색상 이미지λ₯Ό νšŒμƒ‰μ‘° μ΄λ―Έμ§€λ‘œ λ³€ν™˜ν•˜κΈ°

 cv2.imread(img, cv2.IMREAD_GRAYSCALE)

 

1) 평균값을 μ΄μš©ν•˜μ—¬ νšŒμƒ‰μ‘° 이미지 λ³€ν™˜

# BGR 색상 이미지λ₯Ό νšŒμƒ‰μ‘° μ΄λ―Έμ§€λ‘œ λ³€ν™˜ (bgr2gray.py)

import cv2
import numpy as np

img = cv2.imread('img/yate.jpg')

img2 = img.astype(np.uint16)                # dtype λ³€κ²½ ---β‘ 
b,g,r = cv2.split(img2)                     # 채널 λ³„λ‘œ 뢄리 ---β‘‘
#b,g,r = img2[:,:,0], img2[:,:,1], img2[:,:,2]
gray1 = ((b + g + r)/3).astype(np.uint8)    # 평균 κ°’ μ—°μ‚°ν›„ dtype λ³€κ²½ ---β‘’
gray2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR을 그레이 μŠ€μΌ€μΌλ‘œ λ³€κ²½ ---β‘£
cv2.imshow('original', img)
cv2.imshow('gray1', gray1)
cv2.imshow('gray2', gray2)

cv2.waitKey(0)
cv2.destroyAllWindows()

origin&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 평균값 이용&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cv2.cvtcolor 이용

 

2)  OpenCVμ—μ„œ μ œκ³΅ν•˜λŠ” cv2.cvtcolor() ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ νšŒμƒ‰μ‘° 이미지 λ³€ν™˜

cv2.COLOR_BGR2GRAY

: BGR 색상 이미지λ₯Ό νšŒμƒ‰μ‘° μ΄λ―Έμ§€λ‘œ λ³€ν™˜
cv2.COLOR_GRAY2BGR

: νšŒμƒ‰μ‘° 이미지λ₯Ό BGR 색상 μ΄λ―Έμ§€λ‘œ λ³€ν™˜

: μ‹€μ œ νšŒμƒ‰μ‘° 이미지λ₯Ό 색깔이 μžˆλŠ” μ΄λ―Έμ§€λ‘œ λ°”κΏ”μ€€λ‹€λŠ” 뜻 X

: 2μ°¨μ›μ˜ 배열을 κ°–λŠ” 이미지λ₯Ό 3개 채널 λͺ¨λ‘ 같은 값을 κ°–λŠ” 3차원 λ°°μ—΄λ‘œ λ³€ν™˜ O
cv2.COLOR_BGR2RGB

: BGR 색상 이미지λ₯Ό RGB 색상 μ΄λ―Έμ§€λ‘œ λ³€ν™˜
cv2.COLOR_BGR2HSV

: BGR 색상 이미지λ₯Ό HSV 색상 μ΄λ―Έμ§€λ‘œ λ³€ν™˜
cv2.COLOR_HSV2BGR

: HSV 색상 이미지λ₯Ό BGR 색상 μ΄λ―Έμ§€λ‘œ λ³€ν™˜
cv2.COLOR_BGR2YUV

: BGR 색상 이미지λ₯Ό YUV 색상 μ΄λ―Έμ§€λ‘œ λ³€ν™˜
cv2.COLOR_YUV2BGR

: YUB 색상 이미지λ₯Ό BGR 색상 μ΄λ―Έμ§€λ‘œ λ³€ν™˜

 

 

 

3. HSV 방식

: 3개의 채널을 κ°–λŠ” 색상 이미지 ν‘œν˜„λ²•

: H(Hue, 색쑰, μ–΄λ–€ 색상인지)

: S(Saturation, 채도, 색상이 μ–Όλ§ˆλ‚˜ μˆœμˆ˜ν•˜κ²Œ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€)

: V(Value, λͺ…도, 색상이 μ–Όλ§ˆλ‚˜ 밝은지 μ–΄λ‘μš΄μ§€ ν‘œν˜„)

# BGR을 HSV둜 λ³€ν™˜

import cv2
import numpy as np

#---β‘  BGR 컬러 슀페이슀둜 원색 ν”½μ…€ 생성
red_bgr = np.array([[[0,0,255]]], dtype=np.uint8)   # λΉ¨κ°• κ°’λ§Œ κ°–λŠ” ν”½μ…€
green_bgr = np.array([[[0,255,0]]], dtype=np.uint8) # 초둝 κ°’λ§Œ κ°–λŠ” ν”½μ…€
blue_bgr = np.array([[[255,0,0]]], dtype=np.uint8)  # νŒŒλž‘ κ°’λ§Œ κ°–λŠ” ν”½μ…€
yellow_bgr = np.array([[[0,255,255]]], dtype=np.uint8) # λ…Έλž‘ κ°’λ§Œ κ°–λŠ” ν”½μ…€

#---β‘‘ BGR 컬러 슀페이슀λ₯Ό HSV 컬러 슀페이슀둜 λ³€ν™˜
red_hsv = cv2.cvtColor(red_bgr, cv2.COLOR_BGR2HSV)
green_hsv = cv2.cvtColor(green_bgr, cv2.COLOR_BGR2HSV)
blue_hsv = cv2.cvtColor(blue_bgr, cv2.COLOR_BGR2HSV)
yellow_hsv = cv2.cvtColor(yellow_bgr, cv2.COLOR_BGR2HSV)

#---β‘’ HSV둜 λ³€ν™˜ν•œ ν”½μ…€ 좜λ ₯
print("red:",red_hsv)
print("green:", green_hsv)
print("blue", blue_hsv)
print("yellow", yellow_hsv)

red: [[[  0 255 255]]]
green: [[[ 60 255 255]]]
blue [[[120 255 255]]]
yellow [[[ 30 255 255]]]

=> 색상을 μ•Œμ•„λ‚΄κΈ° μœ„ν•΄μ„œ RGB 방식은 μ„Έ 가지 μ±„λ„μ˜ 값을 λͺ¨λ‘ μ•Œμ•„μ•Ό 함

=> HSV 방식은 였직 Hκ°’ ν•˜λ‚˜λ§Œ μ•Œλ©΄ λ˜λ―€λ‘œ μ’€ 더 νŽΈλ¦¬ν•˜κ³  효과적

 

 

 

 

4. YUV, YcbCr 방식

YUV = YCbCr 방식

: YλŠ” 밝기(Luma)

: UλŠ” 밝기와 νŒŒλž€μƒ‰κ³Όμ˜ 색상 μ°¨(Chroma Blue, Cb)

: VλŠ” 밝기와 λΉ¨κ°„μƒ‰κ³Όμ˜ 색상 μ°¨(Chroma Red, Cr)

: Y(밝기)μ—λŠ” λ§Žμ€ λΉ„νŠΈμˆ˜λ₯Ό ν• λ‹Ήν•˜κ³  U(Cb)와 V(Cr)μ—λŠ” 적은 λΉ„νŠΈμˆ˜λ₯Ό ν• λ‹Ή => 데이터λ₯Ό μ••μΆ•ν•˜λŠ” 효과

# BGR 값을 YUV둜 λ³€ν™˜
import cv2
import numpy as np

#---β‘  BGR 컬러 슀페이슀둜 3가지 밝기의 ν”½μ…€ 생성
dark = np.array([[[0,0,0]]], dtype=np.uint8)        # 3 채널 λͺ¨λ‘ 0인 κ°€μž₯ μ–΄λ‘μš΄ ν”½μ…€
middle = np.array([[[127,127,127]]], dtype=np.uint8) # 3 채널 λͺ¨λ‘ 127인 쀑간 밝기 ν”½μ…€
bright = np.array([[[255,255,255]]], dtype=np.uint8) # 3 채널 λͺ¨λ‘ 255인 κ°€μž₯ 밝은 ν”½μ…€

#---β‘‘ BGR 컬러 슀페이슀λ₯Ό YUV 컬러 슀페이슀둜 λ³€ν™˜
dark_yuv = cv2.cvtColor(dark, cv2.COLOR_BGR2YUV)
middle_yuv = cv2.cvtColor(middle, cv2.COLOR_BGR2YUV)
bright_yuv = cv2.cvtColor(bright, cv2.COLOR_BGR2YUV)

#---β‘’ YUV둜 λ³€ν™˜ν•œ ν”½μ…€ 좜λ ₯
print("dark : ",dark_yuv)
print("middle : ", middle_yuv)
print("bright : ", bright_yuv)

dark :  [[[  0 128 128]]]
middle :  [[[127 128 128]]]
bright :  [[[255 128 128]]]

=> BGR값은 (0, 0, 0), (127, 127, 127), (255, 255, 255)둜 μ–΄λ‘μš΄ ν”½μ…€, 쀑간 밝기의 ν”½μ…€, κ°€μž₯ 밝은 ν”½μ…€

=> Yκ°’λ§Œ 0, 127, 255둜 바뀐닀

=> 즉 μ–΄λ‘μš΄ κ°’μ—μ„œ 밝은 κ°’μœΌλ‘œ λ³€ν™˜

=> 밝기에 μ’€ 더 신경을 써야 ν•œλ‹€λ©΄ BGR 방식보닀 YUV 방식을 μ‚¬μš©

 

 

==> 색쑰λ₯Ό ν•œλˆˆμ— μ•Œκ³ μž ν•œλ‹€λ©΄ HSV 방식을 μ‚¬μš©

==> YUV 방식은 밝기에 더 신경을 써야 ν•˜λŠ” κ²½μš°μ— μ‚¬μš©

728x90
λ°˜μ‘ν˜•
Comments