일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자바스크립트심화
- html/css
- 순환신경망
- 데이터분석
- 중학1-1
- c언어
- 중학수학
- 정보처리기사필기
- 컴퓨터구조
- 정보처리기사실기
- 자바 실습
- 오블완
- 상속
- JSP/Servlet
- 개발일기
- 파이썬
- 딥러닝
- 머신러닝
- JSP
- 데이터베이스
- 혼공머신
- 자바
- rnn
- 디버깅
- 연습문제
- JDBC
- SQL
- 자바스크립트
- 컴퓨터비전
- CSS
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
영상 처리 1 - 디지털 영상 기초 본문
컴퓨터 비전 수업은 총 5일 동안 진행되었는데 수업의 질이 많이 떨어지고 수업 영상도 제대로 출력되지 않아 절반 이상은 영상이 없었다. 그냥 첫날 수업 하나만 듣고 정리하는데서 만족하고 이제 나머지는 책을 통해 더욱 깊이있는 학습을 진행하기로 했다.
오히려 책에서 더 많은 것들을 배울 수 있었다. 3장 영상 처리 공부를 시작해보겠다.
시작하기 전에
자율주행차가 아래 왼쪽 그림과 같이 안개 낀 도로에 들어서면 행인이나 표지판을 인식하는 기능이 떨어질 수 있다. 이때 히스토그램 평활화라는 영상 처리 연산을 적용하면 오른쪽 그림의 개선된 영상을 얻는다. 개선된 영상에서 물체를 인식하면 기능을 회복할 수 있다.
영상 처리는 특정 목적을 달성하기 위해 원래 영상을 개선된 영상으로 변환하는 작업이다. 영상 처리는 화질 개선 자체가 목적인 경우가 있다. 이와 달리 컴퓨터 비전은 영상 처리를 전처리 단계에 활용한다. 영상 처리로 개선한 영상을 인식 알고리즘에 입력해 인식 성능을 높이는 것이 목적이다.
영상 처리 연산은 아주 다양하므로 연산을 정확히 이해하고 주어진 문제에 적합한 것을 선택하는 일이 무척 중요하다.
영상 획득과 표현
최초의 디지털 영상은 1920년 유럽과 북미 간에 연결된 Bartlane 시스템이 전송한 영상이었다. 1957년 러셀 커쉬는 아이 사진을 스캔한 디지털 영상을 컴퓨터에 세계 최초로 저장했다.
디지털 카메라는 실제 세상에 존재하는 피사체를 일정한 간격으로 샘플링하고 명암을 일정한 간격으로 양자화하는 과정을 통해 디지털 영상을 획득한다.
핀홀 카메라와 디지털 변환
사람의 눈과 마찬가지로 카메라가 영상을 획득하는 과정을 매우 복잡한데, 아래 그림의 핀홀 카메라 모델은 핵심을 설명한다. 물체에서 반사된 빛은 카메라의 작은 구멍을 통해 안으로 들어가 딧면에 있는 영상 평면에 맺힌다. 영상 평면은 눈의 경우 망막, 필름 카메라의 경우 필름, 디지털 카메라의 경우 CCD 센서다.
빛이라는 아날로그 신호를 받은 CCD 센서는 디지털 신호로 변환한 영상을 메모리에 저장한다. 디지털로 변환하는 과정에서 샘플링과 양자화를 수행한다. 아래 왼쪽 그림에서 보는 바와 같이 샘플링은 2차원 영상 공간을 가로 방향으로 N개, 세로 방향으로 M개 구간으로 나눈다. 이렇게 형성된 한 점을 화소라 하고, M x N을 영상의 크기 또는 해상도라 한다.
이 그림에서는 M과 N이 16인데, 실제로는 M과 N이 수백 ~ 수천이 되도록 샘플링한다. 오른쪽 그림은 양자와 과정을 설명한다. 양자화는 화소의 명암을 L개 구간으로 나눈다. 보통 한 바이트로 표현할 수 있도록 L=256을 사용한다. 그림에서는 빨간색 박스로 표시한 영상 일부를 확대해 양자화된 화소값을 보여준다.
영상 좌표계: (y, x)와 (x, y) 표시
다음 그림은 영상의 좌표계를 설명한다. 가로 방향의 x축은 0, 1, ..., N-1의 정수 좌표를 가지며 세로 방향의 y축은 0, 1, ..., M-1의 정수 좌표를 가진다. 영상은 2차원 공간의 함수로 간주할 수 있다.
디지털 영상의 좌표는 두 가지 측면에서 일반적인 표기와 다르다. 첫 번째는 원점이 왼쪽 위라는 점이다. 예전에 사용하던 CRT 화면의 전자총이 왼쪽 위에서 시작해 아래로 진행하는 물리적 특성에서 유래했다. 컴퓨터그래픽스, 영상처리, 영상 처리, 컴퓨터 비전 분야 모두 관행이다.
둘째는 (x, y) 대신 (y, x) 표기를 사용한다는 점이다. 수학의 행렬과 프로그래밍 언어의 배열에서 행의 좌표를 먼저 적고 열의 좌표를 뒤에 적는 관행에서 유래했다. 디지털 영상은 2차원 배열에 저장되기 때문에 이 관행을 따른다.
이전에 공부했던 바와 같이 OpenCV는 영상을 numpy 모듈의 ndarray 클래스 형으로 표현한다. OpenCV의 영상이 numpy.ndarray이기 때문에 numpy가 지원하는 다양한 함수를 사용할 수 있는 장점이 있다.
영상을 저장하는 배열에서 화소의 위치를 지정할 때는 위의 그림에서처럼 (y, x) 표기를 사용하지만 그 외에는 주로 (x, y)로 표기한다.
다양한 종류의 영상
아래 그림에서 a는 채널이 하나인 명암 영상이다. 명암 영상은 2차원 구조의 배열로 표현한다. b는 RGB 3개의 채널로 구성된 컬러 영상으로서 3차원 구조의 배열로 표현한다. 웹 캠에서 입력되는 컬러 동영상은 c의 4차원 구조의 배열로 표현한다. 컬러 영상은 인간의 눈이 식별할 수 있는 가시광선에서 획득하는 반면, 자외선과 적외선 영역까지 확장한 d의 다분광 영상에는 3~10개 가량의 채널이 있다.
다분광과 초분광은 농업, 군사, 우주, 기상 등의 응용에 유용하게 활용된다. 예를 들어 컬러 영상에서 식별이 불가능한 농작물의 병을 다분광이나 초분광 영상에서는 식별이 가능하다. 의료에서 널리 사용하는 MR 영상이나 CT 영상도 d의 구조를 가진다.
MR 영상의 경우 x축과 y축으로 구성된 평면은 신체의 한 단면을 표현하며 z축은 신체의 위에서 아래로 진행한다.
지금까지는 문체가 반사한 빛을 척정한 디지털 영상을 살펴보았다. 또 다른 종류로 물체까지 거리를 측정한 영상이 있다. 거리를 깊이 또는 레인지라고도 부르며, 거리를 표현한 영상은 깊이 영상 또는 레인지 영상이라고 부른다. 빛은 날씨나 조명 등의 변화에 매우 민감하지만 거리는 둔감하기 때문에 깊이 영상을 사용하는 알고리즘은 이런 변화에 강건하다.
안전이 중요한 자율주행차에서 깊이 영상은 필수다. e는 RGB 컬러 센서와 깊이 센서가 통합된 카메라로 획득한 RGB-D 영상이다.
또 다른 깊이 센서로 라이다(lidar)가 있다. 라이다는 어떤 조건을 만족하는 점의 거리만 측정하기 때문에 영상이 완벽한 격자 구조가 아니다. 따라서 획득한 거리 데이터를 f가 보여주는 점 구름 영상으로 표현한다.
컬러 모델
아래 그림의 왼쪽은 삼원색으로 RGB 컬러 모델을 설명한다. 빨강, 녹색, 파랑의 세 요소를 삮으면 세상의 모든 색을 표현할 수 있다는 이론이다. 가운데 그림은 세 요소의 범위를 0부터 1로 설정해 세상의 모든 색을 RGB 큐브에 넣는다. 이 표현법에서 Red는 (1, 0, 0), Green은 (0, 1, 0), Blue는 (0, 0, 1)로 표현하고, 두 요소를 조합한 Yellow는 (1, 1, 0) 등으로 표현한다. 세 요소가 모두 0인 (0, 0, 0)은 검정이며, 모두 1인 (1, 1, 1)은 하양이다.
RGB 큐브를 디지털 영상으로 표현할 때 오른쪽 그림과 같이 각 요소를 양자와한다. 여기서는 8단계로 양자화했는데, 실제로는 주로 256단계로 양자화해 한 바이트로 표현한다. 예를들어 Red는 (255, 0, 0)이다.
다음 그림은 HSV 컬러 모델을 설명한다. H는 색상, S는 채도, V는 명암을 표현한다. RGB 모델에서는 빛의 밝기가 R, G, B 세 요소에 섞여 있기 때문에 빛이 약해지면 R, G, B 값이 모두 작아진다. 예를 들어 같은 과일을 어둑할 때 찍으면 한낮일 때보다 이 값들이 모두 낮아진다. 이런 성질은 익은 과일을 검출하는 컴퓨터 비전 프로그램을 제작하는 데 방해 요인이 될 수 있다.
HSV 모델에서는 색상은 H 요소, 빛의 밝기는 V 요소에 집중되어 있다. 따라서 영상을 HSV 컬러 공간으로 변환하면 익은 과일을 검출하는데 유리하다.
RGB 채널별로 디스플레이
OpenCV는 디지털 영상을 numpy 모듈이 지원하는 ndarray 클래스로 표현하기 때문에 OpenCV 프로그래밍을 잘 하려면 numpy에 익숙해야 한다.
이제 RGB 영상의 일부를 잘라내고 R, G, B 채널로 분리하기 위해 numpy 배열을 다루는 연습을 해볼 것이다. 9행은 세 채널이 가진 원래 영상 img를 'original_RGB'라는 윈도우에 디스플레이한다.
아래 그림은 10행의 슬라이싱을 그림으로 설명한다. 11행은 첫번째와 두번째 축을 1/4부터 3/4까지 지정해 영상의 중간 부분을 잘라낸다. 13~15행은 img 영상을 채널별로 분리해 서로 다른 윈도우에 디스플레이한다.
RGB 컬러 영상을 채널별로 구분해 디스플레이하기
실행 결과 다음과 같은 이미지가 출력된다.
원본 이미지이다.
왼쪽을 자른 것이다.
가운데를 잘랐다. 세 채널로 분리된 영상에 주목해보자. 빨간색 유니폼 영역은 R 채널에서 밝고 G와 B 채널은 어둡다. G 채널에서는 잔디밭이 비교적 밝고, B 채널에서는 파란색 유니폼 영역과 파란색을 띠는 관중석 영역이 밝다.
등 번호 영역은 검은색이기 때문에 모든 채널에서 어둡고 왼쪽 선수의 스타킹은 한얀색이기 때문에 모든 채널에서 밝다.
학습을 마치고
이렇게 3장의 첫 번째 학습을 진행해보았다. 원래 뭐든 첫 단원을 시작하는 게 그 어떤 단원보다 힘들다. 이 학습 역시 그러했다. 그냥 잠을 잘까 많은 고민을 하다 그래도 공부를 끝까지 마무리해본다.
마지막에 RGB 색상별로 어떤 부분이 밝고 어두운지 판별해보는 예제는 정말 신기했다. 그리고 다양한 종류의 영상이 있으며 평소에는 접할 수 없는 영상의 구조를 확인해볼 수 있었다.
'인공지능 > 컴퓨터 비전' 카테고리의 다른 글
영상 처리 3 - 점 연산 (0) | 2024.11.09 |
---|---|
영상 처리 2 - 이진 영상 (0) | 2024.11.08 |
컴퓨터 비전 4 - pafy로 유튜브 영상 연동 및 pytube로 유튜브 영상 다운로드하기 (0) | 2024.11.08 |
컴퓨터 비전 3 - 동영상 읽고 출력하는 실습해보기 (0) | 2024.11.08 |
컴퓨터 비전 2 - Gray와 Color 이미지 만들기 및 이진 이미지 처리하기 (0) | 2024.11.08 |