안녕하세요. 꼬동입니다.
이미지 분석 스터디를 들어가게 되어서, 그 것의 과제 중 하나인 Open CV, Color Conversions 이론을 공부하게 되었습니다.
솔직히
1도 모르겠습니다.
ㄹㅇ
그래서 이것 저것 찾아보는데, 재미는 있더라고요.
그 장황한 제 일대기를 적어보려합니다.
opencv 는 뭐야 ?
인텔이 만든 이미지 프로세싱에 중점을 둔 오픈 소스 컴퓨터 비전 라이브러리(그래서 opencv인거임 ?????)입니다.
현재 인텔은 opencv에 손을 털었다고 하네요.
저는 요걸 python으로 접했었죠. 그래서 python 만 지원하는 오픈 소스 라이브러리인 줄 알았는데, 본래 C++로 개발이 되었다고 하네요?
그래서 docs 들어가보니, 실제로 C++로 parameter 설명이 되어있었습니다.
현재는 Python을 래핑하여 사용하기 때문에 Python으로 추세가 넘어간거 같습니다. 그리고, 딥러닝 쪽에선 Python이 강세이다 보니,,, 넘어가는 추세가 당연한거일수도 ?
그 외에도 JAVA / Objective-C도 되고 심지어 MATLAB(오랜만)도 된다고 합니다.
이미지 처리를 조금이라도 한다면, opencv를 다루는건 당연하다고 하는데,,, 요것만 잘 다뤄도 고수 정도 된다고 하군여.
뭐...
고수가 언제 되겄어
RGB
color 차원에서 RGB space가 존재합니다. 이미지의 구성이 RED / GREEN / BLUE로 되어 있다라는 뜻인데,
아마 여러분들에게 친숙한 차원 ? space ? (헷갈리니 space라고하겠습니다) 일텐데,
저 게임의 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 ? 였습니다.
'Machine, Deep Learning > Machine, Deep Learning 용어 설명' 카테고리의 다른 글
순환신경망(Recurrent Neural Networks) (0) | 2019.06.21 |
---|---|
활성화 함수(Activation function)이란? (0) | 2019.06.15 |
컨볼루션 신경망 (CNN, Convolutional Neural Network) (0) | 2019.06.15 |
원-핫 인코딩 (One-Hot encoding) (0) | 2019.06.15 |
랜덤 포레스트(Random Forest)란? (0) | 2019.06.15 |