본문 바로가기
IT 프로그래밍 관련/OpenCV

OpenCV HSV 변경

by 지나는행인 2021. 5. 25.
728x90

HSV 는 Hue , 색상 

          Saturation 채도

          Value (Brightness) 명도 를 뜻한다.

 

 

OpenCV를 통하여 간단하게 HSV 변경이 가능하다.

 

먼저 원본 이미지를 

 

cv2.cvtColor 함수를 통하여 BGR2HSV 로 변환.

 

이미지 변환을 위하여 float32로 변환을 해준뒤에 작업한다.

 

그 후에는 cv2.split 함수를 통하여 , 이미지를 hue, saturation, value  , 3개의 채널로 손쉽게 나눌수 있다.

 

3개 채널의 값은 넘파이로, 0부터 255까지의 값만을 갖는다.

 

여기서 각 채널의 값을 넘파이 연산을 통하여 조절할 수 있다.

 

후에 3개의 채널을 다시 cv2.merge 함수를 통하여 합치고, uint8로 변경후에

 

이미지를 다시 불러오면 변경완료!!!

 

 

코드예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import cv2
import numpy as np
 
img = cv2.imread('data/images/capsicum.jpg',1)
 
cv2.imshow('original', img)
 
 
 
# 채도 낮추기
 
saturationScale = 0.01  
 
hsvImage = cv2.cvtColor(img , cv2.COLOR_BGR2HSV)
 
hsvImage = np.float32(hsvImage)
 
 
# 채널로 분리하는 함수  ( 다차원일 경우 사용)
H, S, V = cv2.split(hsvImage)    # 분리됨
 
# 유용한함수. np.clip 함수 이용하면 0보다 작으면 0으로 맞추고, 255보다 크면 255로 맞추라 할수 있다.
 
= np.clip( S * saturationScale , 0,255 ) # 계산값, 최소값, 최대값
# 여기서는 saturation값만 조정하였다.
 
# H,S,V 나눈 채널을 다시 합치는 함수
 
hsvImage = cv2.merge( [ H,S,V ] )
 
# 위에서 float으로 작업 했으로, 다시 uint8로 변경해야된다.
 
hsvImage = np.uint8(hsvImage)
 
# BGR로 다시 변경해야 , 우리가 눈으로 확인 가능 cv2라
 
imgBgr = cv2.cvtColor(hsvImage, cv2.COLOR_HSV2BGR)
 
cv2.imshow('dst', imgBgr)
 
 
 
cv2.waitKey()
cv2.destroyAllWindows()
 
cs

* numpy.clip 함수는 값을 제약한다.

  ex )

  a =  [ 1,2,3,4,5,6,7,8,9 ]

  b = numpy.clip( a, 3, 7 )      # 해당 배열, 최소값, 최대값이 들어간다.

  위와 같은 경우에 b 는 [ 3,3,3,4,5,6,7,7,7 ] 이 된다.

 

*  원본                          ,                  hue 값 변경 후 이미지

 

 

 

댓글