Color Processing

김영헌·2021년 10월 9일
0

Computer Vision

목록 보기
2/5

Color Processing 종류

Intensity Transformation
Histogram equlization
Spatial filtering

이 세가지 기술들은 RGB에 적용하는 것이 아닌 intensity channel을 따로 분리시켜서 intensity channel에 적용시키는 것이다. (HSI or YCbCr로 변경해야함)

Usage of HSI

Color slicing - 원하는 색의 Hue-channel을 찾고 나머지 모든 pixel들의 Saturation-channel은 0으로 설정한다.
아래 예시는 Hue-channel을 9~23으로 설정한 예시이다.

1) 처음에 Mat을 저장하는 size 3개를 가진 vector를 선언한다.
2) slice를 하려는 이미지(colorful)에 rows와 cols를 저장하고 두개의 uchar포인터 선언한다.
3) RGB이미지를 HSV(HSI)이미지로 변경한다. [cvtColor()]
4) 여러개의 channel array를 하나씩 분리한다.[split(inpur, output)]
5) for문을 통해 row와 col을 돌아다니면서 h(hue포인터)와 s(saturation포인터)를 통해 hue가 9~23이면 saturation그대로 아니면 saturation 0으로 만든다.
6) split했던 channel들을 다시 merge시켜주고 HSV에서 RGB로 다시 변경시켜준다.

Color Conversion - Hue채널에 값을 변경하여 그 지역에 색을 변경한다.

for문에서 hue값을 50씩 더해주고 값이 129가 넘는 거는 -129를 해주는 것 말고는 모든 순서는 위에와 동일하다.

Pseudo Coloring - Grayscale 구간에 색을 넣어준다.
의학계 분야에서 많이 사용된다.
1) 사람 눈은 30~50가지에 grayscale인지가 가능하지만 색 같은 경우는 100k ~ 10m까지 인지가 가능하다.
2) 그래서 Intensity Slicing을 통해 intensity들을 분리하고 각각 intensity에 색을 입히는 것이다.

코드는 간단하다. 이미지를 회색으로 읽어오고 applyColorMap이라는 openCV함수를 통해서 값을 넣어주면 끝이다.

White Balancing - 진짜 흰색으로 만들어준다.
사람은 가로등 아래에서 흰색 A4용지를 들고 보게되면 처음에는 조명때문에 주황색으로 보이지만 계속 가만히 보고 있으면 흰색으로 보인다. 하지만, 카메라는 그러하지 않기 때문에 white balancing이 필요로 하는 것이다.

1) RGB를 split을 통해 나누어주고 각각 Mat에 저장한다.
2) for문을 통해 각 채널별로 평균값을 구한다.
3) for문을 통해 그 채널별로 128/평균값 * 기존값을 진행해서 balance되었을 때 비율로 나오게 한다.

128은 Gray world assumption이라고 가장 좋은 밸런스 되었을 때 값이라고 한다.
원리 - R', G', B'을 기존 이미지의 값으로 보고 RGB를 White(255,255,255)로 보았을 때 값이 1 1 1비율로 나와야한다. 그거와 마찬가지로 255를 128로 변경해준 것이다.

참고 사항

Vector - 동적 배열구조로 stack과 Queue랑 비슷한 느낌이지만 중간 값 변경 등 c++에서 제공하는 상위호환 버전으로 생각하면 될 것 같다.
Unsigned char(uchar)쓰는 이유 - 기존 char는 -128~127까지 value를 저장이 가능하다. 하지만, 그 범위를 늘리기 위해 uchar를 쓰는 것이고 uchar는 0~255까지 value를 저장 가능하다.

profile
대기업 회장님

0개의 댓글