소소한 컴퓨터 이야기

색상 변환 (BGR -> HSV, YUV, YCbCr)

by Cori

1. BGR 값을 HSV로 변환 

import cv2 
import numpy as np

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)

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)

print(f'red:{red_hsv}, green:{green_hsv}, blue:{blue_hsv}, yellow:{yellow_hsv}')

2. BGR 값을 YUV로 변환 

import cv2
import numpy as np 

dark = np.array([[[0, 0, 0]]], dtype = np.uint8)
middle = np.array([[[127, 127, 127]]], dtype = np.uint8)
bright = np.array([[[255, 255, 255]]], dtype = np.uint8)

dark_yuv = cv2.cvtColor(dark, cv2.COLOR_BGR2YUV)
middle_yuv = cv2.cvtColor(middle, cv2.COLOR_BGR2YUV)
bright_yuv = cv2.cvtColor(bright, cv2.COLOR_BGR2YUV)

print(f'dark:{dark_yuv}, middle:{middle_yuv}, bright:{bright_yuv}')

3. BGR 값을 YCbCr로 변환 

import cv2
import numpy as np 

dark = np.array([[[0, 0, 0]]], dtype = np.uint8)
middle = np.array([[[127, 127, 127]]], dtype = np.uint8)
bright = np.array([[[255, 255, 255]]], dtype = np.uint8)

dark_ycbcr = cv2.cvtColor(dark, cv2.COLOR_BGR2YCrCb)
middle_ycbcr = cv2.cvtColor(middle, cv2.COLOR_BGR2YCrCb)
bright_ycbcr = cv2.cvtColor(bright, cv2.COLOR_BGR2YCrCb)

print(f'dark:{dark_ycbcr}, middle:{middle_ycbcr}, bright:{bright_ycbcr}')

4. BGR 값을 HSV로 변환 (OpenCV 라이브러리 사용 x)

def BGR2HSV(BGR):
    BGR_array = np.array(BGR).astype(np.float64)
    HSV = np.array(RGB).astype(np.float64)
    
    # RGB 이미지의 width, height 저장
    width, height = BGR_array.shape[:2]
    
    for i in range(width):
        for j in range(height):
            var_B = BGR_array[i, j, 0] / 255.0
            var_G = BGR_array[i, j, 1] / 255.0
            var_R = BGR_array[i, j, 2] / 255.0 
            
            C_Min = min(var_B, var_G, var_R)
            c_Max = max(var_B, var_G, var_R)
            
            change = C_Max - C_Min 
            V = C_Max 
            
            if C_Max == 0:
                S = 0
            else:
                S = change / C_Max
            
            if change == 0:
                H = 0
            else:
                if var_R == C_Max:
                    H = 30 * ((var_G - var_B) / change)
                elif var_G == C_Max:
                    H = 30 * (((var_B - var_R) / change) + 2)
                elif var_B == C_Max:
                    H = 60 * (((var_R - var_B) / change) + 4)
    
            HSV[i, j, 0] = H
            HSV[i, j, 1] = S
            HSV[i, j, 2] = V
    return HSV
def mask(HSV, color):
    hsv = np.array(HSV).astype(np.float64)
    width, heigth = HSV.shape[:2]
    mask = np.zeros((width, height))
    
    for i in range(width):
        for j in range(height):
            if hsv[i, j, 0] > lower[color][0] and hsv[i, j, 1] > lower[color][1] and hsv[i, j, 2] > lower[color][2] \
            and hsv[i, j, 0] < upper[color][0] and hsv[i, j, 1] < upper[color][1] and hsv[i, j, 2] < upper[color][2]: 
                mask[i, j] = 1                                                            
    return mask
def Extraction(image, mask):
    # Object를 추출할 이미지를 생성
    result_img = np.array(image)

    # RGB 이미지의 width, height 저장
    width, height = image.shape[:2]

    # for 루프를 돌면서 mask 원소 값이 0인 인덱스는 원본 이미지도 0으로 만들어 준다.
    for i in range(width):
        for j in range(height):
            if(mask[i, j] == 0):
                result_img[i, j, 0] = 0
                result_img[i, j, 1] = 0
                result_img[i, j, 2] = 0                
    return result_img
upper = {}; lower = {}

upper['orange'] = [100, 1, 1]
upper['blue'] = [300, 1, 1]
upper['green'] = [180, 0.7, 0.5]

lower['orange'] = [0, 0.7, 0.5]
lower['blue'] = [70, 0.7, 0.2]
lower['green'] = [101, 0.15, 0]

# 이미지 파일을 읽어온다
input_image = mping.imread('test2.jpg')

# 추출하고 싶은 색상 입력
input_color = input("추출하고 싶은 색상을 입력하세요 (orange, blue, green) : ")

# RGB to HSV 변환
HSV = RGB2HSV(input_image)

# HSV 이미지를 가지고 마스크 생성
mask = Mask(HSV, input_color)

# mask를 가지고 원본이미지를 Object 추출 이미지로 변환
result_image = Extraction(input_image, mask)

#mping.imsave("result.jpg", result_image)

#이미지 보여주기
imgplot = plt.imshow(result_image)
plt.show()

'AI > Computer Vision' 카테고리의 다른 글

모자이크 처리  (0) 2021.10.19
색상 정보로 객체 추적하기  (0) 2021.10.18
웹캠으로 실시간 움직임 감지하기  (1) 2021.09.26
역투영  (0) 2021.09.25
영상 히스토그램 그리기  (0) 2021.09.24

블로그의 정보

코딩하는 오리

Cori

활동하기