오늘은 영상 처리의 개념과 영상 처리를 위해 알아야 하는 기본 개념에 대해 공부해 볼 것이다.
영상 처리란 인간의 의사 결정에 도움이 되는 영상 정보 취득을 목표로 입력받은 디지털 영상을 목적에 맞게 처리하여 개선된 결과를 얻어내는 분야를 의미한다. 보통 여러 장치들을 통해 이미 생성된 영상을 입력하여 영상을 변화시키거나, 재가공하거나, 복원하는 처리 과정을 영상 처리라고 이야기한다.
참고로, 여기서 이야기하는 영상은 동영상만을 말하는 것이 아니라, 이미지 데이터가 들어가는 모든 것을 의미한다.
이러한 영상 처리는 의료 분야에서의 CT, MRI나, 공장 자동화 분야에서의 제품 품질 모니터링 및 불량 판별 등에 널리 사용되고 있다.
영상 처리를 공부하기 전 알아야 할 기본 개념을 간략히 정리해 보자.
'Picture element'의 줄임말로, 이미지를 구성하는 요소 하나하나를 나타낸다. 우리가 보는 모든 이미지들은 사실 다수의 픽셀로 이루어져 있다.
예를 들어, 원본 이미지를 확대하였을 때, 이미지가 작은 사각형들로 이루어져 있다는 사실을 확인할 수 있는데, 이렇게 이미지를 이루는 작은 사각형 한 개를 픽셀이라고 하는 것이다.
비디오 내에서 1초 당 나타내는 이미지 수를 의미하며, 주로 FPS(Frame Per Second)라는 단위를 사용한다. 이 값이 증가할수록 초당 존재하는 이미지 수가 많아지기 때문에 이미지가 더 부드러워지는 효과가 있다.
예를 들어서 개발자가 코딩하는 모습을 gif 형식의 움직이는 이미지로 만든다고 할 때, 1초당 나타내는 이미지의 수가 많으면 많을수록 동영상처럼 이미지의 흐름이 잘 이어지는 것을 확인할 수 있는데, 그렇지 않은 경우엔 약간의 끊김이 느껴진다. 이를 조절하는 것이 Frame rate이다.
일반적으로 비디오에서 영상 간의 간격은 33ms로, 1초에 30개의 영상이 존재한다는 것을 의미한다.
각 픽셀이 가질 수 있는(만들어낼 수 있는) 값의 개수를 의미하며, 보통 형태로 존재한다.
보통 하나의 픽셀에 존재하는 Intensity level은 256(=)이며, 이는 하나의 픽셀이 하나의 값을 가질 때 0~255 사이의 값을 가질 수 있음을 나타낸다.
Intensity level이 크면 클수록 이미지가 더 정교하게 표현된다.
아래의 사진을 한 번 살펴보자. 이 사진은 Intensity level이 각각 16, 8, 4, 2인 경우를 나타낸다. 살펴보다 보면, 첫 번째 사진처럼 Intensity가 가장 클 때 정교하게 표현되는 것을 확인할 수 있다.

Resolution은 하나의 영상을 구성하는 데 몇 개의 픽셀이 사용되었는지를 의미한다.
아래의 사진은 픽셀 수에 따른 Resolution를 나타내는데, 이 사진에서도 알 수 있듯, 물체의 디테일을 명확하게 표현하기 위해선 하나의 영상을 구성하는 데 많은 픽셀이 사용되는 것이 좋다.

주요 해상도의 종류는 다음과 같다.
| 종류 | 해상도 | 비고 |
|---|---|---|
| VGA | 640x480 | |
| HD | 1280x720 | 1k |
| FHD | 1920x1080 | 2k |
| QHD | 2560x1440 | |
| UHD | 3840x2160 | 4k |
여기서 PPI(Pixels Per Inch)라는 개념도 나오는데, 이는 인치당 몇 개의 pixel이 존재하는지 눈에 보이는 화질을 결정하는 개념이다. 따라서 해상도가 동일할 경우 스마트폰의 PPI는 TV의 PPI보다 클 수밖에 없고, 이는 동일한 거리에서 시청했을 때 스마트폰의 화질이 TV보다 좋다고 이야기할 수 있다.
일반적으로, 하나의 영상을 구성하는 데 필요한 총 비트 수는 아래의 수식을 통해 계산할 수 있다.
(이때, M은 행의 수(높이), N은 열의 수(너비), k는 비트수이다)
그렇다면 다음 영상에 필요한 bit 수를 추측해 보자.
- Color video
- FHD pixel resolution
- 1 Hour
- 30 fps
이때, Color video이기 때문에 r, g, b 총 3byte = 24bit이고, FHD는 1920*1080의 값을 지니고, 1 Hour = 3600초이므로 24 x 1920 x 1080 x 3600 x 30 = 5,374,771,200,000 bit = 625.70 GB와 같이 필요한 비트 수를 계산할 수 있다.
대표적인 컬러 모델들에 대해 알아보기 전에 빛의 삼원색, 색의 삼원색, 무채색의 개념에 대해 정리해 보자.

RGB는 R-channel, G-channel, B-channel로 구성되며, 컬러들의 분광 요소들이 부가적으로 복합되어 결과적인 컬러를 만들어 낸다.
RGB에서 Intensity level은 일반적으로 256이므로 [0,255]의 범위로 표현한다.

참고로 OpenCV에서 색상 채널의 순서는 RGB의 반대 순서인 BGR 순서이다. 그래서 색 공간을 변경하는 코드에서도 다음과 같이 표현한다.
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
HSI는 Hue-channel, Saturation-channel, Intensity-channel로 구성된다. 여기서는 색상, 채도, 명도라는 3가지 특성들이 색을 설명하는 데 사용되며, 어떤 컬러 모델을 만들어 낼 때 얼마나 색을 사용했는지 알 필요 없이 단순히 채도와 명도를 통해 색을 조절한다.
HSI 모델에서 Hue는 원의 각도, Saturation은 원의 bound, Intensity는 높이를 통해 알 수 있다.

이러한 HSV를 사용하는 이유는 이미지에서 색상 정보를 검출하고자 할 때, Hue를 사용하면 되므로 RGB보다 분류가 더 쉽기 때문이다.
OpenCV에서 각각 채널의 값 범위
- 0<H<360, H/2(0<H<180)
- 0<S<1, 255*S(0<S<255)
- 0<V<1, 255*V(0<V<255)
YCbCr은 Y, Cr, Cb를 이용해 색을 표현하는 방식이다. YCC라고도 불린다.
Hue와 Saturation의 값이 모두 0이어서 각 픽셀의 밝기만 표현 가능한 흑백 이미지을 의미한다.
Lightness(or Brightness)를 조절해 이미지를 표현하며, 값이 0에 가까울수록 검정색에, 255에 가까울수록 흰색에 가까워진다.
Intensity Transformation이란, 입력 받은 이미지에 변환 함수를 적용해 이미지의 Intensity 값을 조정하는 것을 의미한다.
Image negatives는 이미지의 Intensity 값이 [0, L-1]의 범위에 있을 때, 이라는 수식을 가하여 이미지를 조정하는 것을 의미한다. 이때 S는 output, r은 input을 의미한다.
Image negatives는 이미지의 어두운 부분은 밝게, 밝은 부분은 어둡게 하기 때문에 어두워서 세부 정보를 확인하기 힘든 이미지의 세부 정보를 확인하기 위해 주로 사용한다.

Log transformation은 입력 이미지에 로그 함수를 적용하여 Intensity 값을 조정하는 것을 의미한다.
Log transformation에서는 로그 변환을 위해 다음과 같은 수식을 사용한다.
, (이때, c는 constant, r은 input, s는 output을 의미한다)
로그 함수는 일반적으로, 낮은 숫자에 대해 상대적으로 큰 값을 생성한다는 특징이 있는데 이러한 특성 때문에 Log transformation을 수행하면 낮은 Intensity 값의 변화는 상대적으로 커보이고, 높은 Intensity 값의 변화는 상대적으로 작아보인다. 그래서 어두운 부분에서의 대조가 커지면서 세부 사항이 변환 이전보다 잘 보인다.

Power-Law transformation은 감마 값을 통해 이미지의 Intensity를 조정하는 것을 의미한다.
이 방식에선 다음과 같은 수식을 사용하는데, 이때 감마 값에 따라 어두운 픽셀의 범위가 늘어나거나 줄어드는 것을 확인하는 게 중요하다.
(이때, c는 constant, r은 input, s는 output을 의미한다)
아래의 사진에서도 볼 수 있듯, 감마 값이 1보다 크면 밝은 부분의 밝기가 강조되고, 1보다 크면 어두운 부분의 밝기가 강조되는 것을 확인할 수 있다.

++) 저번 학기 수업 시간에 교수님께서 컴퓨터 비전에서 무슨 내용을 배우는지 간략히 설명해 주신 영상에서 봤던 것들과 같은 개념이 여럿 나오는 걸 보면서 서로 관련이 있는 분야 같다는 생각이 들었다. 그래서 컴퓨터 비전과 영상 처리 분야가 어떤 연관성이 있는지, 그리고 어떤 차이점이 있는지 추가적으로 조사를 해봤다.
일단 영상 처리는 원시 이미지 자체를 조금 더 나은 버전(기존 이미지보다 더 선명하고 목적에 맞는 이미지)으로 변경하는 것을 목적으로 한다. 색상을 조정하거나, 모서리를 매끄럽게 하거나, 배경을 블러링하는 것과 같은 모든 행위들이 영상 처리의 고유 영역에 해당한다.
반면, 컴퓨터 비전은 어떠한 영상을 입력으로 받고 패턴 인식, 딥러닝, 객체 탐지 등을 통해 이것이 무엇을 의미하는지 이해하고, 영상으로부터 유용한 정보를 뽑아내는 것을 목표로 한다. 이때 컴퓨터 비전의 성능 향상엔 영상의 퀄리티가 큰 영향을 미치기 때문에 조금 더 나은 결과를 얻어내기 위해 영상 처리가 빠질 수 없다.
말이 장황하긴 하지만, 쉽게 말해 컴퓨터 비전에서 목표하는 바를 이루려면 반드시 영상 처리가 필요하다. 그래서 컴퓨터 비전을 영상 처리를 포함하는 조금 더 큰 범주로 본다.
| 분야 | input | output | 특징 |
|---|---|---|---|
| 영상 처리 | 영상 | (처리된) 영상 | 입력된 영상을 목적에 맞게 개선 |
| 컴퓨터 비전 | 영상 | 정보 | 기본적인 영상처리를 바탕으로 영상에서 특정한 정보 추출 |