색상 변환 (BGR -> HSV, YUV, YCbCr)
by Cori1. 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