-
HSV ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์์ Object ์ถ์ถํ๊ธฐ๊ณต๋ถ/๋ฉํฐ๋ฏธ๋์ด 2019. 3. 30. 00:46728x90
๊ตฌํ
1. RGB ์ด๋ฏธ์ง๋ฅผ ์ ๋ ฅ๋ฐ์ HSV ์ด๋ฏธ์ง๋ก ๋ณํํ๋ค.
2. ์์์ ๋ฒ์์ ๋ฐ๋ผ ํน์ ์์์ ๊ฐ์ฒด๋ฅผ ์ถ์ถํ๋ ๋ง์คํฌ๋ฅผ ์์ฑํ๋ค.
3. ์์ฑํ ๋ง์คํฌ์ ๋ฐ๋ผ ์ด๋ฏธ์ง๋ฅผ ๊ณ์ฐํ์ฌ ํน์ ํ ์์์ ๊ฐ์ฒด๋ง ์ถ์ถ๋๋ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ ๋ค.
4. OpenCV๋ฅผ ์ฌ์ฉํด์๋ ํด๋ณด๊ณ ์์ฐ๊ณ ๋ ํด๋ดค๋ค.
RGB to HSV
- ์ผ๋จ, ํน์ ์์ ๊ฐ์ฒด๋ฅผ ์ถ์ถํ๊ธฐ ์ํด์ ์ HSV ์ด๋ฏธ์ง๊ฐ ํ์ํ์ง๋ถํฐ ์์์ผ ํ๋ค.
RGB ๋ชจ๋ธ
- RGB ๋ชจ๋ธ์ ๋น์ ์ผ์์์ ์ด์ฉํ์ฌ ์์ ํํํ๋ ๊ธฐ๋ณธ์ ์ธ ์์ ๋ชจ๋ธ
- ์์ ๋นจ๊ฐ(Red), ์ด๋ก(Green), ํ๋(Blue), 3๊ฐ์ง ์ฑ๋ถ์ ์กฐํฉ์ผ๋ก ํํํ๋ค
- R, G, B๊ฐ์ 0~255 ์ฌ์ด์ ๊ฐ๋ค๋ก ํํ๋๋ค.
HSV ๋ชจ๋ธ
- HSV ๋ชจ๋ธ์ ์ธ๊ฐ์ ์์ธ์ง์ ๊ธฐ๋ฐ์ ๋ ์์ ๋ชจ๋ธ
- Hue(์์กฐ), Saturation(์ฑ๋), Value(๋ช ๋), 3๊ฐ์ง ์ฑ๋ถ์ ์กฐํฉ์ผ๋ก ํํ
- Hue(์์กฐ) : ์์ ์ข ๋ฅ. 0º~360º์ ๋ฒ์๋ฅผ ๊ฐ๋๋ค.
- Saturation(์ฑ๋) : ์์ ์ ๋ช ๋, ์งํจ์ ์ ๋(๊ฐ์ฅ ์งํ ์ํ๋ฅผ 100%๋ก ํ๋ค)
- Value(๋ช ๋) : ์์ ๋ฐ๊ธฐ, ๋ฐ์ ์ ๋(๊ฐ์ฅ ๋ฐ์ ์ํ๋ฅผ 100%๋ก ํ๋ค)
RGB ์์ HSV๋ก ๋ณํํ๋ ์ด์
- RGB ์ด๋ฏธ์ง์์ ์ ์ ๋ณด๋ฅผ ๊ฒ์ถํ๊ธฐ ์ํด์๋ R, G, B ์ธ๊ฐ์ง ์์ฑ์ ๋ชจ๋ ์ฐธ๊ณ ํด์ผํ๋ค.
- ํ์ง๋ง HSV ์ด๋ฏธ์ง์์๋ H(Hue)๊ฐ ์ผ์ ํ ๋ฒ์๋ฅผ ๊ฐ๋ ์์ํ ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ RGB ์ด๋ฏธ์ง๋ณด๋ค ์ฝ๊ฒ ์์ ๋ถ๋ฅํ ์ ์๋ค.
RGB to HSV ๊ณต์
- ์์ ๊ณต์์์๋ HSV ์ด๋ฏธ์ง๋ฅผ H์ ๋ฒ์๋ 0~360์ผ๋ก S, V๋ 0~1์ ๋ฒ์๋ก ์ ๊ทํ ํ๋ค.
- OpenCV์์๋ HSV ์ด๋ฏธ์ง๋ฅผ H(0~180), S(0~255), V(0~255)๋ก ํํํ๋ค.
- H(Hue)๊ฐ 360์ด ์๋ 180์ผ๋ก ๋ฒ์๋ฅผ ์ง์ ํ ์ด์ ๋ OpenCV ์ด๋ฏธ์ง ๋ณ์๋ค์ 8bit๋ก ์ค์ ๋์ด ์์ด์ ์ต๋ 255๊น์ง๋ง ํํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
mask ์์ฑ
- ๋ชจ๋ ์์๊ฐ์ด 0์ธ HSV ์ด๋ฏธ์ง์ ๊ฐ์ ํฌ๊ธฐ์ ๋ง์คํฌ ํ๋ ฌ์ ๋ง๋ ๋ค
- HSV ์ด๋ฏธ์ง ํฝ์ ๊ฐ๊ณผ ๋ด๊ฐ ์ํ๋ ์์ ๋ฒ์๋ฅผ ๋น๊ตํด์ ํฝ์ ๊ฐ์ด ์์ ๋ฒ์ ์์ ์์ ๊ฒฝ์ฐ, ๊ทธ์ ๋์๋๋ ์์น์ ๋ง์คํฌ ํ๋ ฌ์ ์์ ๊ฐ์ 1์ ์ ๋ ฅํ๋ค.
- HSV์ ์์ ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ตฌํ ๊ณผ์ ์์ ์์์ ๋ฒ์๋ฅผ ์ง์ ํ๋๊ฒ ์ ์ผ ํ๋ค์๋ค. ์ก์์ผ๋ก ๋ด๊ฐ ๊ฒ์ถํ๋ ์์์ H, S, V๊ฐ์ ์ ํํ ์ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋์ ๋ ์์ํด์ ๋ฒ์๋ฅผ ์ง์ ํ ๋ค์ ์ ๊ฒ์ถ๋๋ ๋ฒ์๋ก ๊ณ์ ์์ ํ๋ค.
- OpenCV์์ ์์กฐ ๋ฒ์๋ 0~180์ด๋ฏ๋ก ์ํ๋ ์์์ ์ป์ผ๋ ค๋ฉด HSV ์์ํ ๊ฐ์์ 1/2 ํด์ค์ผ ํ๋ค.
โป ์ค๋ ์ง ์๊ณผ ์ด๋ก์์ ์์ํ์ ์ผ์นํ๋๋ฐ ํ๋์์ ์ ํ ๋ค๋ฅธ ์์น์์ ๊ฒ์ถ๋์๋ค. ์ ๊ทธ๋ด๊น...?๐ค
mask๋ฅผ ์ด์ฉํ object ์ถ์ถ ์ด๋ฏธ์ง ๊ณ์ฐ
- ์๋ณธ ์ด๋ฏธ์ง์ ๋์๋๋ mask ํ๋ ฌ์ ๊ฐ์ ๋ฐ๋ผ ์๋ณธ ์ด๋ฏธ์ง๋ฅผ ๊ณ์ฐํ๋ค.
- mask ๊ฐ์ด 1์ธ ๋ถ๋ถ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์์์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ R, G, B๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์๋๋ค.
- mask ๊ฐ์ด 0์ธ ๋ถ๋ถ์ R, G, B๊ฐ์ 0์ ๊ณฑํด ๊ฒ์ ์์ผ๋ก ๋ง๋ ๋ค.
Code
OpenCV๋ฅผ ์ฌ์ฉํด์ ๊ตฌํ
import cv2 # matplotlib.image ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ matplotlib ๋ฟ๋ง ์๋๋ผ pillow๋ ๊น์์ผ ํ๋ค. import matplotlib.pyplot as plt import matplotlib.image as mpimg # ์์ ๋ฒ์ ์ค์ lower_orange = (100, 200, 200) upper_orange = (140, 255, 255) lower_green = (30, 80, 80) upper_green = (70, 255, 255) lower_blue = (0, 180, 55) upper_blue = (20, 255, 200) # ์ด๋ฏธ์ง ํ์ผ์ ์ฝ์ด์จ๋ค img = mpimg.imread("test2.jpg", cv2.IMREAD_COLOR) # BGR to HSV ๋ณํ img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # ์์ ๋ฒ์๋ฅผ ์ ํํ์ฌ mask ์์ฑ img_mask = cv2.inRange(img_hsv, lower_orange, upper_orange) # ์๋ณธ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ง๊ณ Object ์ถ์ถ ์ด๋ฏธ์ง๋ก ์์ฑ img_result = cv2.bitwise_and(img, img, mask=img_mask) # ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ์์ฑ imgplot = plt.imshow(img_result) plt.show()
OpenCV์์ด ๊ตฌํ
import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mping def RGB2HSV(RGB): # HSV ์์์ ์ป๊ธฐ ์ํด์๋ array ํ์ ์ด float์ด ๋์ด์ผ ๊ณ์ฐํ ์ ์๋ค RGB_array = np.array(RGB).astype(np.float64) # ๋ณํํ HSV ์ด๋ฏธ์ง ์์ฑ HSV = np.array(RGB).astype(np.float64) # RGB ์ด๋ฏธ์ง์ width, height ์ ์ฅ width, height = RGB_array.shape[:2] # ์ด๋ฏธ์ง ํฌ๊ธฐ๋งํผ for ๋ฃจํ for i in range(width): for j in range(height): # ๊ณต์ ๋ฐ๋ผ์ ๊ตฌํ var_R = RGB_array[i, j, 0] / 255.0 var_G = RGB_array[i, j, 1] / 255.0 var_B = RGB_array[i, j, 2] / 255.0 C_Min = min(var_R, var_G, var_B) C_Max = max(var_R, var_G, var_B) 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 = 60 * (((var_R - var_B)/change)%6) elif var_G == C_Max: H = 60 * (((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 ์ด๋ฏธ์ง ์์ฑ, ํ๋ผ๋ฏธํฐ์ ์๋ HSV๋ฅผ ๊ทธ๋ฅ ์ฐ๋ฉด ์์๊ฐ์ด float์ด ์๋ int๋ก ๋์ด hsv = np.array(HSV).astype(np.float64) # HSV ์ด๋ฏธ์ง์ width, height ์ ์ฅ width, height = HSV.shape[:2] # ๋ชจ๋ ๊ฐ์ ์์ ๊ฐ์ด 0 ์ธ ๋ง์คํฌ ํ๋ ฌ ์์ฑ mask = np.zeros((width, height)) # hsv ๊ฐ๊ณผ ๋ฒ์ ๋น๊ต for i in range(width): for j in range(height): # H, S, V ๊ฐ์ด ์ํ๋ ๋ฒ์ ์์ ๋ค์ด๊ฐ ๊ฒฝ์ฐ mask ์์ ๊ฐ์ 1๋ก ๋ง๋ ๋ค 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 if __name__ == '__main__': # ๋ง์คํฌ ์์ ๋ฒ์์ ์ฌ์ฉํ ๋์ ๋๋ฆฌ ์ ์ 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()
๊ฒฐ๊ณผ๋ฌผ
- ๋ง์ง๋ง ํ๋์ ์์์ ์ง์ ๊ตฌํํ์๋๋ ์ ํํ ๊ฒ์ถ๋์ง ์์๋ค.
- RGB to HSV ๊ณต์ ๊ตฌํ์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ์๋๋ฉด ์์ ๋ฒ์๋ฅผ ์ ๋๋ก ์ง์ ํ์ง ๋ชปํ ๊ฒ ๊ฐ์๋ฐ ์ข ๋ ์์ ์ด ํ์ํ๋ค.
์ฐธ๊ณ ์ฌํญ
- OpenCV๋ฅผ ์ฌ์ฉํด์ ์ฝ์ด ๋ค์ธ ์ด๋ฏธ์ง๋ฅผ matplotlib๋ก ํ๋ฉด์ ์ถ๋ ฅํ ๋, ์ถ๋ ฅํ ์์ด ์ด์ํ๊ฒ ๋์ค๋๋ฐ ๊ทธ ์ด์ ๋ OpenCV์์๋ ์ปฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ RGB๊ฐ ์๋ BRG์์๋ก ์ ์ฅํ๋๋ฐ matplotlib์์ RGB ์์๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ matplotlib์์ ์ถ๋ ฅํ ๋๋ BRG๋ฅผ RGB๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค.
- H, S, V๊ฐ์ ์ฐพ๋๊ฒ ์๊ฐ๋ณด๋ค ํ๋ค์๋ค. ์ผ์ผ์ด ์ฐพ๋ ๋ฌด์ํ ๋ฐฉ๋ฒ์ด ์๋๋ผ ์ํ๋ ํฝ์ ์์์ H, S, V ๊ฐ์ ํ์ธํ ์ ์๊ฒ ๋ง๋ค์ด์ผ ๋ฒ์๋ฅผ ์ฝ๊ฒ ์ ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
๐ค
728x90'๊ณต๋ถ > ๋ฉํฐ๋ฏธ๋์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ค๋์ค ์ฝ๋ฑ(Audio Codec) ์ข ๋ฅ (0) 2020.11.02 ๋น๋์ค ์ฝ๋ฑ(Video Codec) ์ข ๋ฅ (0) 2020.11.02 ๋์์ ํ์ฅ์(Media Container Format) ์ข ๋ฅ (2) 2020.11.02 ๋์์ ํ์ฅ์์ ๋ํ ์ดํด - ์ปจํ ์ด๋(Container), ์ฝ๋ฑ(Codec) (0) 2020.11.02 HoloLens๋ฅผ ์ด์ฉํ MR Contents(์ตํฉํ์ค ์ฝํ ์ธ ) ๊ตฌํ (1) 2019.03.31