본문 바로가기
OpenCV

OpenCV - 색 변경

by winston1214 2020. 9. 3.
반응형

OpenCV의 COLOR 변경에 대해서 알아보겠다.

OpenCV에는 COLOR에 관한 많은 flag가 있다. 이를 확인하기 위해선 

print([x for x in dir(cv2) if x.startswith('COLOR_')]) # all flag list

이 코드를 치면 나온다. 차마 output 값을 보여주지 못하는게 너무 많다. 그래서 리스트에 담고 길이를 세봤더니

tmp = [x for x in dir(cv2) if x.startswith('COLOR_')]
len(tmp) # 274

무려 274개가 나왔다. 이를 통해 외우지말고 갓글링을 하는 것이 답이다~라는 결론을 낼 수 있다.

이제 COLOR를 적용한 예시코드이다.

img = cv2.imread('img/input.jpg',cv2.IMREAD_COLOR)
gray_img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) # color to gray
cv2.imshow('Grayscale img',gray_img)
cv2.waitKey()
cv2.destroyAllWindows()

input이라는 jpg 파일을 컬러로 받아서 RGB2GRAY 로 변환한다. 이는 컬러 색상에서 흑백 사진으로 변하는 것이다.

cvtColor 함수를 통해 이를 구현 할 수 있다. cvtColor => Convert color

다음은 YUV 값으로의 변환이다. YUV는 https://ko.wikipedia.org/wiki/YUV를 참고하면 더욱 자세하게 알 수 있다.

한 줄 요약하자면 RGB 전송 오류나 압축 가공물을 더 효율적으로 마스킹될 수 있게 한다는 것이다.

yuv_img = cv2.cvtColor(img,cv2.COLOR_BGR2YUV)
cv2.imshow('yuv img',yuv_img) # color rgb -> bgr
cv2.waitKey()
cv2.destroyAllWindows()

코드는 위와 비슷한데 하나의 다른 점이 있다. 바로 시작점이 BGR인 것이다.

기본적으로 OpenCV는 대체로 알려진 RGB 값이 아닌 거꾸로 BGR을 사용한다.

그 이유는 개발자 마음이라고 그런다..

BGR을 사용한다는 것을 꼭꼭 기억해두어야 한다.

yuv

 

이제 이미 구성되어 있는 조합이 아닌 자신만의 조합으로 색을 변경하는 방법을 알아보자.

앞서 언급했듯이 cv2는 BGR 로 구성되어 있는 것을 유념해야한다.

이는 각각의 채널로 나뉘어져 있다. 그래서 우린 그 채널을 split을 통해 분리하고 조절하면 자신만의 색으로 조합이 가능하다.

방금 확인했던 yuv의 채널을 쪼개서 확인해보자

y,u,v = cv2.split(yuv_img)
cv2.imshow('y channel',y) # gray scaling
cv2.imshow('u channel',u) # Chrominance
cv2.imshow('v channel',v) # Chrominance
cv2.waitKey()
cv2.destroyAllWindows()

y,u,v

split으로 쪼갠 후 y,u,v 변수에 각각 할당을 해주고 imshow를 나타낸 결과이다.

다음으로 bgr을 쪼개보자

img = cv2.imread('img/input.jpg',cv2.IMREAD_COLOR)
b,g,r = cv2.split(img) # channel split
bbg_img = cv2.merge((b,b,g))
rbr_img = cv2.merge((r,b,r))
cv2.imshow('original',img)
cv2.imshow('gbr',bbg_img)
cv2.imshow('rbr',rbr_img)
cv2.waitKey()
cv2.destroyAllWindows()

split으로 b,g,r 로 쪼갠 다음 merge를 통해 색깔 섞기를 한 결과이다. 매우 다양한 색이 도출된다.

 

 

 

반응형

댓글