색상 변환 (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()
블로그의 정보
코딩하는 오리
Cori