본문 바로가기

Machine, Deep Learning/Machine, Deep Learning 용어 설명

opencv - grayscale mode vs gray color conversion / 왜 BGR ?

반응형
SMALL

안녕하세요. 꼬동입니다.

 

이미지 분석 스터디를 들어가게 되어서, 그 것의 과제 중 하나인 Open CV, Color Conversions 이론을 공부하게 되었습니다.

 

솔직히

 

1도 모르겠습니다.

 

ㄹㅇ

 

 

그래서 이것 저것 찾아보는데, 재미는 있더라고요.

 

그 장황한 제 일대기를 적어보려합니다.


opencv 는 뭐야 ?

 

인텔이 만든 이미지 프로세싱에 중점을 둔 오픈 소스 컴퓨터 비전 라이브러리(그래서 opencv인거임 ?????)입니다.

 

현재 인텔은 opencv에 손을 털었다고 하네요.

 

저는 요걸 python으로 접했었죠. 그래서 python 만 지원하는 오픈 소스 라이브러리인 줄 알았는데, 본래 C++로 개발이 되었다고 하네요?

 

그래서 docs 들어가보니, 실제로 C++로 parameter 설명이 되어있었습니다.

 

이거 C++ 맞죠?

 

현재는 Python을 래핑하여 사용하기 때문에 Python으로 추세가 넘어간거 같습니다. 그리고, 딥러닝 쪽에선 Python이 강세이다 보니,,, 넘어가는 추세가 당연한거일수도 ?

 

그 외에도 JAVA / Objective-C도 되고 심지어 MATLAB(오랜만)도 된다고 합니다.

 

이미지 처리를 조금이라도 한다면, opencv를 다루는건 당연하다고 하는데,,, 요것만 잘 다뤄도 고수 정도 된다고 하군여.

 

뭐...

 

고수가 언제 되겄어


RGB

color 차원에서 RGB space가 존재합니다. 이미지의 구성이 RED / GREEN / BLUE로 되어 있다라는 뜻인데,

 

아마 여러분들에게 친숙한 차원 ? space ? (헷갈리니 space라고하겠습니다) 일텐데,

 

흔한 K-게임 고인물

저 게임의 RGB가 그 RGB 맞습니다.

 

하나의 픽셀에 R / G / B 세개의 차원이 각각 [0, 255] / [0, 255] / [0, 255] 사이의 값을 가지면서, "색"을 표현하게 됩니다.

 

RGB, 색 조합의 경우의 수를 따져보면, 256 * 256 * 256 = 16,777,216 색상이 나오는데, (저는 좀 놀란게, 너무 적어서 놀랬습니다. 저희가 인생 사는데, 이 색상이 보이는 색의 다란 소리라면 너무 적개 느껴지지 않나요) 하나의 색상을 보고 컴퓨터는 RGB 값을 구해내야한다는 것이 되겠죠.

 

 


Grayscale

Grayscale도 너무나도 친숙한 space입니다. 단순히 흑백으로 구분을 지어놓는거니까요.

 

Range도 [0, 255]로 동일합니다.

 

그렇다면 RGB 값을 동일한 weight로 쪼개어 합산하면 그게 GrayScale이 되는게 아닌가요 ? 라고 물어보실 수 있는데,

 

제가 이 글을 적게된 이유와도 같은 질문입니다.

 

아마 대부분이 사람들이 RGB to GrayScale을 하면,

Y = 0.333 * R + 0.333 * G + 0.333 * B

위를 기대하실텐데, opencv에선 다르게 계산을 하더라고요 ??

 

실상으론 아래와 같이 계산을 진행합니다.

Y = 0.299 * R + 0.587 * G + 0.114 * B

이러실 수도 있는데
진짜입니다.

근데, 아무도 이에 대해서 설명을 안 적어놨더라고요 !!!

 

공홈에서도 !!!!

 

너무 궁금하지 않나요 !!!!!

 

그래서 찾아보니, 인간이 신체학적으로 초록 > 빨간 > 파란으로 예민하게 반응을 한다고 하더라고요. 그래서 이렇게 나온 상수 값이 아닐까 싶습니다. (우리가 숲을 가면 눈이 편한게, 그거 때문인가봐요..? / 그리고 블루 라이트 차단 안경을 쓰는게 파란색은 편하게 바라볼 수 없으니, 차단시키는 건가......봐요... ? 잘 모름)


GrayScale Mode VS Color Conversion (RGB to Gray)

좀 더 찾아보니 더 재밌는게 있더군요.

 

opencv에서 이미지 파일을 읽을 때, imread 메소드를 이용해서 읽습니다.

 

그리고, 옵션으로 GrayScale로 이미지를 가져올 수 있죠.

 

즉, 흑백으로 가져온다는 말입니다.

 

근데, 순간 읭 했죠.

 

그럼 Color Conversion은 왜 있는 걸까요 ? cvtColor로도 충분히 GrayScale을 만들 수 있거든요.

 

사실 이 둘은 완전히 같지는 않습니다.

 

opencv가 imread로 file을 읽어올 땐, BGR 포맷을 알고 있기 때문이죠.

 

BGR은 무엇인가요 ?
BGR은 그냥,,,, RGB의 역순입니다.
왜 BGR을 쓰냐면, openCV 만든 사람(Dr. Gary Bradski)한테 "왜, 보편적으로 쓰는 RGB 안 쓰고, BGR 쓰냐"고 물어봤는데,
그 인간이 "왜, 미국은 4피트 8.5인치의 기찻길을 쓰냐"라고 되물었다고 하더군요. 그냥 있길래 썼다는 뜻.

실제로 4피트 8.5인치를 쓰는 이유는 영구에서 그렇게 썼었고, 미국 철도는 영국 국외 거주자들에 의해 건설되었다고 하네요.
그러면 왜 또 영국인들이 그렇게 만들었을까요. 로마 제국 전차의 원래 사양과 유사하다고 하네요. 두 마리의 군마가 이끌 수 있게 하기 위해서 인듯 합니다.

 

아마 저 Gray Bradski라는 사람은 INTJ가 분명할 것입니다.

어쨌든, 파일을 읽을 때 부터 알고 있는 BGR format으로 gray scale로 바꾸는 imread GrayScale mode에 비해 color conversion은 그렇지 못해서 완벽하게 같지 않다는 거죠.

 

같은 파일을 두 가지 방식으로 흑백처리 후 서로 비교를 했을 때의 사진입니다.

 

보시면 픽셀 하나하나씩 뭔가 별이 있는거 처럼 빛이 날 것입니다.

 

뭐,,, 크게 차이는 없다만, 다르긴 하다 라는게 이 글의 핵심입니답.

 

그래서 왜 그럼 따로 뒀냐 라고 ... 물어보실 수 있는데,

 

저도 모르겠습니다. 하하

 

서로 계수가 다르겠죠 뭐.

 

외쿡인이 쓰신 거 보니, cvtColor 메소드는 opencv의 전반적인 플랫폼에 일관되게 수행되는데, imread는 사용되는 플랫폼에 따라 좌우된다고 하네요.

 

그래서, 각 플랫폼마다 다른 grayscale을 반환해도 뭐 이상하지 않다고 합니다.

 

그래서 imread에서 grayscale로 변환하지 말라고 추천하는데,,,

 

안해봐서 모르겠습니다.

 

이론만 알고 가자고요.


이상 opencv - grayscale mode vs gray color conversion / 왜 BGR ? 였습니다.

반응형
LIST