You are looking for information, articles, knowledge about the topic nail salons open on sunday near me opencv hsv 색상 표 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://chewathai27.com/to team, along with other related topics such as: opencv hsv 색상 표 OpenCV HSV 색 검출, OpenCV HSV range, OpenCV 색상 추적, OpenCV HSV 변환, HSV 색상 추출, hsv 색상 코드표, HSV 색상 범위, OpenCV HSV 흰색
HSV 이미지를 사용하여 특정 색상 Object 추출하기 :: 🤔메모장😦
- Article author: bradbury.tistory.com
- Reviews from users: 10830 Ratings
- Top rated: 4.3
- Lowest rated: 1
- Summary of article content: Articles about HSV 이미지를 사용하여 특정 색상 Object 추출하기 :: 🤔메모장😦 OpenCV에서 색조 범위는 0~180이므로 원하는 색상을 얻으려면 HSV 색상표 값에서 1/2 해줘야 한다. ※ 오렌지 색과 초록색은 색상표와 일치했는데 … …
- Most searched keywords: Whether you are looking for HSV 이미지를 사용하여 특정 색상 Object 추출하기 :: 🤔메모장😦 OpenCV에서 색조 범위는 0~180이므로 원하는 색상을 얻으려면 HSV 색상표 값에서 1/2 해줘야 한다. ※ 오렌지 색과 초록색은 색상표와 일치했는데 … 구현 1. RGB 이미지를 입력받아 HSV 이미지로 변환한다. 2. 색상의 범위에 따라 특정 색상의 객체를 추출하는 마스크를 생성한다. 3. 생성한 마스크에 따라 이미지를 계산하여 특정한 색상의 객체만 추출되는 결과..
- Table of Contents:
구현
RGB to HSV
RGB 모델
HSV 모델
RGB 에서 HSV로 변환하는 이유
RGB to HSV 공식
mask 생성
mask를 이용한 object 추출 이미지 계산
Code
결과물
참고사항
관련글 관련글 더보기
인기포스트
opencv 입문하기 7-2편 HSV, 특정 색상 추출(inRange)
- Article author: sikaleo.tistory.com
- Reviews from users: 11973 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about opencv 입문하기 7-2편 HSV, 특정 색상 추출(inRange) HSV 색 공간 또는 HSV 모델은 색을 표현하는 하나의 방법이자, 그 방법에 따라 색을 배치하는 방식이다. 색상(Hue), 채도(Saturation), 명도(Value)의 … …
- Most searched keywords: Whether you are looking for opencv 입문하기 7-2편 HSV, 특정 색상 추출(inRange) HSV 색 공간 또는 HSV 모델은 색을 표현하는 하나의 방법이자, 그 방법에 따라 색을 배치하는 방식이다. 색상(Hue), 채도(Saturation), 명도(Value)의 … 1. HSV HSV 색 공간 또는 HSV 모델은 색을 표현하는 하나의 방법이자, 그 방법에 따라 색을 배치하는 방식이다. 색상(Hue), 채도(Saturation), 명도(Value)의 좌표를 써서 특정한 색을 지..
- Table of Contents:
태그
‘머신러닝딥러닝opencv’ Related Articles
[C++ opencv] HSV 색상 검출하기
- Article author: diyver.tistory.com
- Reviews from users: 27167 Ratings
- Top rated: 4.8
- Lowest rated: 1
- Summary of article content: Articles about [C++ opencv] HSV 색상 검출하기 Updating …
- Most searched keywords: Whether you are looking for [C++ opencv] HSV 색상 검출하기 Updating 본문 목표 영상처리를 하다보면 특정 물체의 색을 인식해야할 상황이 주어진다. 컴퓨터에서 다룰 수 있는 색 영역은 크게 RGB 와 HSV 가 있는데, RGB는 컴퓨터에 최적화 되어있고, HSV는 사람의 눈과 비슷하다. 물..
- Table of Contents:
본문 목표
알아볼 함수 원형
코드 테스트 결과
태그
관련글
댓글5
공지사항
최근글
인기글
최근댓글
태그
티스토리툴바
OpenCV – 7. 이미지 색상 표현 방식(BGR, HSV, YUV)
- Article author: bkshin.tistory.com
- Reviews from users: 47264 Ratings
- Top rated: 3.0
- Lowest rated: 1
- Summary of article content: Articles about OpenCV – 7. 이미지 색상 표현 방식(BGR, HSV, YUV) Updating …
- Most searched keywords: Whether you are looking for OpenCV – 7. 이미지 색상 표현 방식(BGR, HSV, YUV) Updating 이번 포스팅에서는 OpenCV로 색상을 표현하는 방식에 대해 알아보겠습니다. 이번 포스팅 역시 ‘파이썬으로 만드는 OpenCV 프로젝트(이세우 저)’를 정리한 것임을 밝힙니다. 코드: github.com/BaekKyunShin/OpenCV..
- Table of Contents:
귀퉁이 서재
OpenCV – 7 이미지 색상 표현 방식(BGR HSV YUV) 본문
티스토리툴바
OpenCV | Python | HSV 색공간에서 이미지의 특정색 추출하기
- Article author: velog.io
- Reviews from users: 34897 Ratings
- Top rated: 3.0
- Lowest rated: 1
- Summary of article content: Articles about OpenCV | Python | HSV 색공간에서 이미지의 특정색 추출하기 Updating …
- Most searched keywords: Whether you are looking for OpenCV | Python | HSV 색공간에서 이미지의 특정색 추출하기 Updating 우선 색공간이란 색을 표현하는 방법을 3차원 좌표계로 표현한 것이다. 그 중 RGB 와 HSV 색공간이 존재한다.먼저 RGB 는 빛의 삼원색인 빨강, 초록, 파랑을 이용하여 색을 표현하는 방식이다. 따라서 총 세 채널로 구성되어있으며, 각 채널은 0-255 의 범위를
- Table of Contents:
[OPENCV] 5. 색 공간 모델 HSV
- Article author: 95mkr.tistory.com
- Reviews from users: 21882 Ratings
- Top rated: 3.4
- Lowest rated: 1
- Summary of article content: Articles about [OPENCV] 5. 색 공간 모델 HSV 1. HSV란? ○ 2. OPENCV의 HSV함수. ○ 3. 코드 작성. ○ 4. 심화 … 그에 비해 HSV 색 공간은 색을 혼합할 수록 밝아지는 가산혼합과 혼합할 수록 … …
- Most searched keywords: Whether you are looking for [OPENCV] 5. 색 공간 모델 HSV 1. HSV란? ○ 2. OPENCV의 HSV함수. ○ 3. 코드 작성. ○ 4. 심화 … 그에 비해 HSV 색 공간은 색을 혼합할 수록 밝아지는 가산혼합과 혼합할 수록 … ☞ 메인보드 : Jetson Nano Developer Kit ☞ 운영 체제 : Ubuntu 18.04 – JetPack 4.4.1 ☞ OpenCV 버전 : 4.2.0 ☞ IDE : Visual Studio Code ☞ 언어 : C++ 목차 ○ 1. HSV란? ○ 2. OPENCV의 HSV함수 ○ 3. 코..
- Table of Contents:
목차
① HSV란
② OPENCV의 HSV 함수
③ 코드 작성
④ 심화
태그
‘ITOPENCV’ Related Articles
티스토리툴바
Opencv 파이썬 Colab – Hsv로 변환 및 원하는 색상 부분 추출하기 | opencv hsv 색상 표 오늘 업데이트
- Article author: ko.nataviguides.com
- Reviews from users: 5624 Ratings
- Top rated: 4.3
- Lowest rated: 1
- Summary of article content: Articles about Opencv 파이썬 Colab – Hsv로 변환 및 원하는 색상 부분 추출하기 | opencv hsv 색상 표 오늘 업데이트 … opencv hsv 색상 표:. …
- Most searched keywords: Whether you are looking for Opencv 파이썬 Colab – Hsv로 변환 및 원하는 색상 부분 추출하기 | opencv hsv 색상 표 오늘 업데이트 … opencv hsv 색상 표:.
- Table of Contents:
주제에 대한 비디오 보기 opencv hsv 색상 표
OpenCV 파이썬 Colab – HSV로 변환 및 원하는 색상 부분 추출하기 – opencv hsv 색상 표 및 이 주제에 대한 세부정보
키워드 정보 opencv hsv 색상 표
콘텐츠에 대한 이미지 opencv hsv 색상 표
주제에 대한 기사 평가 opencv hsv 색상 표
기사의 키워드 OpenCV 파이썬 Colab – HSV로 변환 및 원하는 색상 부분 추출하기
Recent Posts
Recent Comments
OpenCV를 이용하여 특정색 (빨간색) 검출 – 멈춤보단 천천히라도
- Article author: webnautes.tistory.com
- Reviews from users: 4701 Ratings
- Top rated: 4.7
- Lowest rated: 1
- Summary of article content: Articles about OpenCV를 이용하여 특정색 (빨간색) 검출 – 멈춤보단 천천히라도 Updating …
- Most searched keywords: Whether you are looking for OpenCV를 이용하여 특정색 (빨간색) 검출 – 멈춤보단 천천히라도 Updating 아래 유튜브 영상에 본 포스팅을 개선한 내용이 포함되어 있습니다. 최종업데이트 – 2018. 6. 10 OpenCV를 이용하여 카메라로부터 캡쳐되는 영상은 BGR 영상입니다. RGB가 아니라 BGR이라고 부르는 것은 Blue, Gre..
- Table of Contents:
참고
티스토리툴바
HSV (색상, 채도, 명도)
- Article author: gammabeta.tistory.com
- Reviews from users: 20845 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about HSV (색상, 채도, 명도) Updating …
- Most searched keywords: Whether you are looking for HSV (색상, 채도, 명도) Updating HSV (색상, 채도, 명도) 색을 RGB로 많이 표현하지만 색을 HSV (색상, 채도, 명도)는 나타낼 수도 있다. H (Hue) 색상: 빨강, 파랑, 노랑 등과 같은 색의 종류를 나타낸다. S (Saturation) 채도: 짙은 빨강, 옅은..
- Table of Contents:
관련글
댓글0
공지사항
최근글
인기글
최근댓글
티스토리툴바
See more articles in the same category here: Chewathai27.com/to/blog.
HSV 이미지를 사용하여 특정 색상 Object 추출하기
728×90
구현
1. RGB 이미지를 입력받아 HSV 이미지로 변환한다.
2. 색상의 범위에 따라 특정 색상의 객체를 추출하는 마스크를 생성한다.
3. 생성한 마스크에 따라 이미지를 계산하여 특정한 색상의 객체만 추출되는 결과 이미지를 만든다.
4. OpenCV를 사용해서도 해보고 안쓰고도 해봤다.
입력 이미지와 결과 이미지(orange 색상인 객체만 추출)
RGB to HSV
– 일단, 특정 색상 객체를 추출하기 위해서 왜 HSV 이미지가 필요한지부터 알아야 한다.
RGB 모델
출처 : https://tattly.com/products/rgb
– RGB 모델은 빛의 삼원색을 이용하여 색을 표현하는 기본적인 색상 모델
– 색을 빨강(Red), 초록(Green), 파랑(Blue), 3가지 성분의 조합으로 표현한다
– R, G, B값은 0~255 사이의 값들로 표현된다.
HSV 모델
출처 : https://ko.wikipedia.org/wiki/HSV_%EC%83%89_%EA%B3%B5%EA%B0%84#/media/File:HSV_cone.jpg
– 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 공식
출처 : https://www.rapidtables.com/convert/color/rgb-to-hsv.html
– 위의 공식에서는 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의 색상 범위는 다음과 같다.
출처 : https://brunch.co.kr/@chulhochoiucj0/17
– 구현 과정에서 색상의 범위를 지정하는게 제일 힘들었다. 육안으로 내가 검출하는 색상의 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
opencv 입문하기 7-2편 HSV, 특정 색상 추출(inRange)
1. HSV
HSV 색 공간 또는 HSV 모델은 색을 표현하는 하나의 방법이자, 그 방법에 따라 색을 배치하는 방식이다. 색상(Hue), 채도(Saturation), 명도(Value)의 좌표를 써서 특정한 색을 지정한다. 비슷한 것으로 HSL(Lightness), HSI(Intensity) 등이 있다.
RGB가 색을 빨강, 초록, 파랑의 조합으로 표현한다면, HSV는 우리가 보는 그대로의 색을 Hue 채널로 나타낸다. 그리고 그 색의 진하고 연한 정도를 Saturation 채널로 표현하고, 밝기를 Value로 결정한다.
RGB 색 공간보다는 좀 더 우리들이 색을 판단하는 과정과 유사한 것이 HSV 색 공간이다. 예를 들어 노란색을 표현하고자 하면, RGB 색 공간은 빨강과 초록의 조합으로 노랑을 표현해야하기에 직관성이 떨어진다. 반면 HSV 색 공간은 색들의 조합이 아닌 그 색깔 자체를 알려주므로 직관성이 좋다.
만약 색깔을 통해 이미지에서 어떤 물체를 검출하고 싶다면, RGB 공간보다는 HSV 공간이 적합할 것이다.
다음 그림은 HVS 색 공간을 한 눈에 설명해준다. 원뿔 모양으로 HSV 공간을 표현했는데, 우선 색조는 원뿔의 밑면에 해당되고 360도 연속적으로 배치되어 있음을 볼 수 있다. 그리고 명도는 원뿔의 높이에 해당한다. 꼭지점으로 갈수록 어두워진다.
채도는 원뿔의 밑면의 중심에서 가까울수록 연해지고 멀어질수록 진해진다.
색상 : H ) 0 – 360 의 범위를 가지고, 가장 파장이 긴 빨간색을 0도로 지정한다.
채도 : S ) 0 – 100 의 범위를 가지고, 색상이 가장 진한 상태를 100으로 하며, 진함의 정도를 나타낸다.
명도 : V ) 0 – 100 의 범위를 가지고, 흰색, 빨간색을 100, 검은색이 0이며, 밝은 정도를 나타낸다.
RGB -> HSV
import numpy as np import cv2 color = [255,0,0] # BGR 순서 ; 파란색 pixel = np.uint8([[color]]) # 한 픽셀로 구성된 이미지로 변환 # BGR -> HSV hsv = cv2.cvtColor(pixel, cv2.COLOR_BGR2HSV) print(hsv, ‘shape:’, hsv.shape ) # 픽셀값만 가져오기 hsv = hsv[0][0] print(“bgr: “, color) print(“hsv: “, hsv) # +_ 10
앞선 포스팅에서 RGB2HSV 를 종종 사용했었다.
위 코드를 실행해서 임의로 한 픽셀로 된 이미지를 만들어서 numpy array 를 살펴보자.
어떤 수식으로 변환할걸까? 공식문서에서 나온 공식을 참고 해보자.
H 는 0~360 , S 와 V 는 0~1 범위이다. 이는 맨 위에서 다룬 원뿔 모양으로 표현한 HSV 모델 구조를 생각해보면 이해가 될 것이다.
H는 절반값이고 나머지는 maximize 된 것으로 이해된다.
2. inRange(특정 색상 추출)
HSV 개념을 이해했다면 이를 활용하여 특정 생상을 추출해보겠습니다.
일반적으로 BGR 보다는 HSV 가 성능이 좋습니다.
결과
코드
# inRange import numpy as np import cv2 img_color = cv2.imread(‘color circle_w.jpg’) # 이미지 파일을 컬러로 불러옴 print(‘shape: ‘, img_color.shape) height, width = img_color.shape[:2] # 이미지의 높이와 너비 불러옴, 가로 [0], 세로[1] img_hsv = cv2.cvtColor(img_color, cv2.COLOR_BGR2HSV) # cvtColor 함수를 이용하여 hsv 색공간으로 변환 lower_blue = (120-10, 30, 30) # hsv 이미지에서 바이너리 이미지로 생성 , 적당한 값 30 upper_blue = (120+10, 255, 255) img_mask = cv2.inRange(img_hsv, lower_blue, upper_blue) # 범위내의 픽셀들은 흰색, 나머지 검은색 # 바이너리 이미지를 마스크로 사용하여 원본이미지에서 범위값에 해당하는 영상부분을 획득 img_result = cv2.bitwise_and(img_color, img_color, mask = img_mask) cv2.imshow(‘img_origin’, img_color) cv2.imshow(‘img_mask’, img_mask) cv2.imshow(‘img_color’, img_result) cv2.waitKey(0) cv2.destroyAllWindows()
중간에 color 이미지의 shape 은 shape: (472, 600, 3) 인데요.
여기서 472 는 행(Y축), 600 은 열(X축) , 3 은 행과열이 만나는 지점의 값이 몇개의 원소로 이루어져 있는지를 나타냅니다. 위 값의 의미는 이미지 사이즈는 600 * 472 (가로 * 세로) (너비 * 높이) 로 보시면 됩니다.
472 = 가로 = 너비
600 = 세로 = 높이
입니다.
위 결과를 조금 확대해서 보여드리자면,
### 2번째 이미지 ###
다른 이미지도 적용해보겠습니다.
위와 같은 이미지에서 특정 색상을 추출해보겠습니다.
# inRange 함수를 이용해서 특정 색상 검출 import cv2 src = cv2.imread(‘inRange.jpg’) # size 축소 src = cv2.resize(src, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST) src_hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV) # 0 < B < 100 , 128 < G < 255 , 0 < R < 100 dst1 = cv2.inRange(src, (0, 128, 0), (100, 255, 100)) img_result = cv2.bitwise_and(src_hsv, src_hsv, mask = dst1) dst2 = cv2.inRange(src_hsv, (50, 150, 0), (80, 255, 255)) img_result2 = cv2.bitwise_and(src_hsv, src_hsv, mask = dst2) cv2.imshow('src', src) cv2.moveWindow('src',400,100) cv2.imshow('dst1', dst1) cv2.moveWindow('dst1',400,450) cv2.imshow('img_result', img_result) cv2.moveWindow('img_result',800,450) cv2.imshow('dst2', dst2) cv2.moveWindow('dst2',400,800) cv2.imshow('img_result2', img_result2) cv2.moveWindow('img_result2',1100,450) cv2.waitKey() cv2.destroyAllWindows() ** 참고 ** ttps://ko.wikipedia.org/wiki/HSV_%EC%83%89_%EA%B3%B5%EA%B0%84 https://bskyvision.com/46 https://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html https://velog.io/@nayeon_p00/OpenCV-Python-HSV-%EC%83%89%EA%B3%B5%EA%B0%84%EC%97%90%EC%84%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%9D%98-%ED%8A%B9%EC%A0%95%EC%83%89-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0 https://opencv-python.readthedocs.io/en/latest/doc/01.imageStart/imageStart.html
[C++ opencv] HSV 색상 검출하기
본문 목표
영상처리를 하다보면 특정 물체의 색을 인식해야할 상황이 주어진다.
컴퓨터에서 다룰 수 있는 색 영역은 크게 RGB 와 HSV 가 있는데,
RGB는 컴퓨터에 최적화 되어있고,
HSV는 사람의 눈과 비슷하다.
물체의 색을 인식한다면 사람과 같은 방식인 HSV 색 영역을 사용해야 하는데,
Opencv 에서 어떻게 HSV 색채널을 다룰 수 있는지 알아보자.
키워드 : inRange( ) , bitwise_and( ), HSV
알아볼 함수 원형
– 이중 임계값 처리 ( inRange )
Mat img = imread(“balls.jpg”); Mat img_hsv; cvtColor(img, img_hsv, COLOR_BGR2HSV); Mat yellow_mask, yellow_image; Scalar lower_yellow = Scalar(20, 20, 100); Scalar upper_yellow = Scalar(32, 255, 255); inRange(img_hsv, lower_yellow, upper_yellow, yellow_mask); bitwise_and(img, img, yellow_image, yellow_mask);
inRange( src , lower_value, upper_value, dst)
○ src : 입력할 이미지 변수
○ lower_value : threshold 값 1, 임계값 1 로 낮은 값을 입력,
○ upper_value : threshold 값 2, 임계값 2 로 높은 값을 입력
○ dst : 필터가 적용되어 저장될 이미지 변수
이 때, lower_value 와 upper_value 에는 Scalar 값으로 넣어 줘야 한다.
Scalar 값은 총 3가지 값으로, 색 채널에따라 순서가 달라진다.
RGB 의 경우에는 R G B 순서로 입력해야하고,
BGR 의 경우 B G R 순서로 입력해야 한다.
당연 HSV 의 경우에는 H S V 순서로 입력해야 한다.
inRange 함수는 이미 앞에서 다룬 적 있는 내용이므로, 관심있다면 참고하면 좋을 듯 하다.
https://diyver.tistory.com/69
HSV 가 뭔지 알아야 이번 내용이 이해가 된다.
HSV 색 채널은 사람의 색상 인식 방식과 같다고 앞에서 언급했다.
그러면 왜 HSV 색 채널을 사용하는지 알아야 이번 내용이 이해가 된다.
잠깐동안 왜 HSV 색 채널을 사용하는지 고민하는 시간을 가져보자.
사람은 어두운 곳에 있는 빨간색 공을 보고 빨간색이라고 인식한다.
그러나 RGB 색 채널을 사용하는 컴퓨터는 알기 어렵다.
어두운 곳에 있는 빨간색은 R G B 값 모두 부족하지만 그나마 R 값이 살짝 높다고 인식할 것이다.
매우 부정확한 방법이 될 수 있다.
그래서 컴퓨터에서 HSV 색 채널을 사용하는 것이다.
HSV 는 Hue 색상, Saturation 채도, Value 밝기(명도) 의 정보를 담은 색 채널이다.
위의 색 도형은 HSV 색 채널을 가시적으로 나타낸 것이다.
Hue 에 따라서 색상은 정해지게 되고,
Saturation 에 따라서 색상의 농도가 정해진다.
마지막으로 Value 에 따라서 색상의 밝기가 정해진다.
색상이 있다면 어두운데에 있던지, 밝은데에 있던지 Hue 값의 범위가 있으므로 감지가 가능한 것이다.
대신 어느정도 채도와 밝기를 띄고 있어야 인식이 가능하다.
포토샵 부터 다른 이미지 다루는 프로그램은 Hue 값을 0~360 범위로 사용한다.
그 이유는 위의 그림을 보면 알 수 있듯이, 원기둥이기 때문이다.
Hue 값에 따른 색상표를 제작해봤다. 대략적인 수치들을 기입해놓았으므로
필요한 수치는 위에서 참고하면 된다.
간혹 다르게 사용하는 경우가 있는데, 이는 데이터 값 때문이다.
보통 8bit 를 데이터 값으로 많이 사용하는데, 0~255 까지만 사용할 수 있어서 한계가 있다.
당장 ‘그림판’만 해도 HSV 색채널에는 0~240 까지만 사용한다.(RGB는 255 까지 사용)
OpenCV 에서는 Hue 값은 0~179 까지 사용할 수 있다. (180 은 0과 같다.)
Saturation 과 Value 값은 0~255 까지 사용할 수 있다.
따라서 원하는 색상 검출을 좀 정교하게 하고 싶은 경우,
그림판의 Hue 값을 참고하되 0.75 배를 해서 값을 사용해야 한다.
예를 들면, 노란색의 Hue 값이 그림판 상에서 39를 나타내고 있다면,
OpenCV에서는 0.75 배를 하고 반올림 한 29 를 사용해야한다.
이외에도 무료로 Hue 값을 알아볼 수 있는 무료 사이트들이 많으므로, 찾아서 이용하면 된다.
따라서 이러한 HSV 색 채널에 대한 특성을 이용하여,
OpenCV 의 기본 함수인 inRange 함수를 통해 해당 범위의 색을 골라낼 수 있다.
첫 번째의 threshold 값에는 낮은 값을 넣어야 한다.
두 번째의 threshold 값에는 높은 값을 넣어야 한다.
inRange( ) 함수는 threshold1 값 이상과 threshold2 값 이하의 범위만 밝은 값이 되고,
그 외의 범위는 검은색이 된다.
한마디로 이진화가 되는 것이다.
그런데 이미지에서 색상 추출한 부분을 컬러로 확인하고 싶은 경우에는
bitwise_and( ) 함수를 사용해야 한다.
bit 연산을 하는데, & 연산을 하는 것이다.
여기에는 위에서 다룬 inRange( ) 의 결과물이 mask로 사용된다.
검은색은 데이터로 나타내자면 0이 되고,
검은색 이외의 데이터는 True 값이므로,
검은색 부분은 & 연산으로 검은색이 되고,
검은색이 아닌부분은 원본의 색을 띄게 된다.
코드 테스트 결과
– CODE
#include
using namespace cv; using namespace std; int main(int ac, char** av) { Mat img = imread(“balls.jpg”); Mat img_hsv; cvtColor(img, img_hsv, COLOR_BGR2HSV); Mat yellow_mask, yellow_image; Scalar lower_yellow = Scalar(20, 20, 100); Scalar upper_yellow = Scalar(32, 255, 255); inRange(img_hsv, lower_yellow, upper_yellow, yellow_mask); bitwise_and(img, img, yellow_image, yellow_mask); imshow(“img”, img); imshow(“yellow_image”, yellow_image); imshow(“yellow_mask”, yellow_mask); waitKey(0); return 0; } – RESULT
사용한 원본이미지는 다양한 색상의 공들이 있는 사진이다.
balls.jpg 0.11MB
원본 파일은 BGR 채널이므로, HSV 채널로 변환시켜줘야 한다.
노란색을 검출할 것이므로,
yellow_mask 와 yellow_image 라는 이미지 변수를 만들어 준다.
그리고 inRange( ) 에서 사용할 값 두개를 미리 선언해준다.
lower_yellow 와 upper_yellow 라고 이름짓고, Hue 값은 20~32 범위로 설정하였다.
채도와 명도는 100~255 로 하면 적당하지만,
사용자의 입맛에 맞게끔 바꿔줘야 더 좋은 결과가 나온다.
inRange( ) 를 통해서 이진화된 이미지를 yellow_mask 에 저장하고,
bitwise_and( ) 함수를 이용하여, 원본이미지에 yellow_mask를 씌워서 bit 연산을 하고, yellow_image 에 저장한다.
inRange( ) 함수를 이용하여 노란색 범위만 이중 임계값으로 처리한 이진화 이미지이다.
노란색 부분만 하얗게 변한 것을 볼 수 있다.
그 외의 부분들은 검정색을 띄고있다.
bitwise_and( ) 함수의 결과 이미지이다.
bit 연산을 통해 원본 이미지에서 yellow_mask 와 연산한 것이다.
노란색만 살아남고, 결과에서도 노란색만 출력이 가능하다.
시각적인 결과가 필요하다면 bitwise_and( ) 함수를 사용해야 한다.
추가로 반사되어 노란 빛이 나는 부분이 있는데, 없애는 방법이 있다.
바로 이전에 배웠던 Opening 기법이다.
침식시키고 확장시키는 방법으로
erode 후에 dilate 를 적용하면 된다.
확실히 깔끔해 진 것을 볼 수 있다.
이처럼 erode 와 dilate 기법은 이런 자잘한 노이즈를 없앨 때, 유용하게 사용된다.
결론.
inRange( ) 함수를 이용하여 HSV 색채널을 이용한 색상 검출이 가능하다.
bitwise_and( ) 함수를 이용하여 색상 검출 된 영역을 컬러로 표현할 수 있다.
erode 와 dilate 를 이용하여 검출된 이미지에서 노이즈를 제거할 수 있다.
도움이 되었거나, 문제가 있는 경우 댓글로 알려주세요~!
감사의 댓글은 작성자에게 큰 힘이 됩니다 ^^
So you have finished reading the opencv hsv 색상 표 topic article, if you find this article useful, please share it. Thank you very much. See more: OpenCV HSV 색 검출, OpenCV HSV range, OpenCV 색상 추적, OpenCV HSV 변환, HSV 색상 추출, hsv 색상 코드표, HSV 색상 범위, OpenCV HSV 흰색