728x90
728x90
* HSV
- 특정 색 추출
- RGB는 영상을 어떤것을 가져왔느냐에 따라 성능이 다름(밝기)
- HSV에선 Value로 명암을 조절할 수 있기 때문에 더 유용함
'''
# HSV ( Hue, Saturation, Value )
색상, 채도, 명도
H(0~180), S(0~255), V(0~255)
inRange = 낮은 범위(lowerb)에서 높은 범위(upperb) 사이의 요소를 추출
'''
img = cv.imread('code007\\color_image.jpg')
img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV) # HSV
(h, s, v) = cv.split(img_hsv) # cv.split
# HSV = 특정 색만 검출 할 수 있다
# hsv 이미지 참조(0~360인데 opencv 에서 2로 나눠서 색 구별)
orange_h = cv.inRange(h, 8, 20) # == 주황색 부분 흰색
orange = cv.bitwise_and(img_hsv, img_hsv, mask=orange_h)
orange = cv.cvtColor(orange, cv.COLOR_HSV2BGR)
'''
cv2.inRange
lowerb: 하한 값 행렬 또는 스칼라
upperb: 상한 값 행렬 또는 스칼라
'''
cv.imshow('image', img)
cv.imshow('img_hsv', img_hsv)
cv.imshow('h', h)
cv.imshow('s', s)
cv.imshow('v', v)
cv.imshow('orange_h', orange_h)
cv.imshow('orange', orange)
cv.waitKey()
1. imread
2. cvtcolor = BGR2HSV
3. inRange
4. bitwise_and
5. cvtcolor = HSV2BGR
* YCrCb
- 영상의 밝기 정보와 색상 정보를 따로 분리하여 부호화 (흑백 TV 호환)
- 인간의 눈은 색의 정보보다 밝기에 예민하다
- Green이 없는데 이는 Cr + Cb를 섞으면 Green 된다.
Y : 밝기 정보
Cr : Chroma Red 색차 정보
Cb : Chroma Blue 색차 정보
cv2.CV_8U의 경우
0 ≤ 𝑌 ≤255
0 ≤ 𝐶𝑟 ≤ 255
0 ≤ 𝐶𝑏 ≤ 255
* HSV= 정해져있는 color 추출할때 유용(빨주노초...)
* YCrCb = 임의의 color 추출할때 유용 ==> 주로 LAB, YCrCb 사용
import sys
import numpy as np
import cv2
src = cv2.imread('ch03\\images\\candies.png')
if src is None:
print('Image load failed!')
sys.exit()
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
'''
# 특정 색 추출 (*해당 색 흰색으로*)
'''
# 이미지를 보면 RGB가 더 깨끗하게 나오고 HSV는 지저분한 픽셀이 나옴
# RGB가 더 좋다고 볼 수 없는것이 이미지가 어두워지면 성능이 떨어짐
# HSV를 주로 사용하게된다.(V = 0 ~ 255를 할당하면 어두운 영상도 반환해줌)
dst1 = cv2.inRange(src, (0,128,0), (100,255,100))
dst2 = cv2.inRange(hsv, (50,150,0), (80,255,255))
cv2.imshow('hsv', hsv)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
##############################################################
# cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
# cv2.namedWindow 설정해줘야해 = windowName
# pos 인자값 지정
def onChange(pos):
# pos 지정
hmin = cv2.getTrackbarPos('H_min', 'dst')
hmax = cv2.getTrackbarPos('H_max', 'dst')
# H만 설정 값으로 지정
dst = cv2.inRange(hsv, (hmin, 150, 0), (hmax, 255, 255))
cv2.imshow('dst', dst)
cv2.imshow('src', src)
cv2.namedWindow('dst')
# 두개를 지정했기 때문에 onChange함수에서 getTrackbarPos를 사용해서
# 최소 최대 값을 지정해줌
cv2.createTrackbar('H_min', 'dst', 50, 170, onChange)
cv2.createTrackbar('H_max', 'dst', 80, 170, onChange)
# onChange(0) ==> 생략가능??
cv2.waitKey()
728x90
'OpenCV > OpenCV-basic' 카테고리의 다른 글
이미지 연산, 배열 정합(addWeighted) (0) | 2021.12.12 |
---|---|
모폴로지 연산(Morphology) (0) | 2021.12.12 |
opencv-VideoCapture, VideoWriter (0) | 2021.12.11 |
opencv-findContours (0) | 2021.12.11 |
opencv-basic (0) | 2021.12.11 |
댓글