본문 바로가기

카테고리 없음

영상처리의 개념

728x90

영상처리 연구실에서 2년간 학부연구생으로 근무해놓고도 기본적인 개념을 100% 설명 못했던적이 있어서,

이번 기회에 영상처리에 대한 용어와 개념을 정리해보고자 합니다.

 

일단은 기본적인 개념만 정리를 하고, 이후에 시간이 된다면 코드로 구현하는 방법까지 정리해보겠습니다.

그리고 포스팅이 끝날때 쯤 목차를 만들겠습니다.

 


영상처리란?

영상은 아날로그 영상과 디지털 영상으로 나뉩니다.

아날로그 영상은 픽셀위치가 실수좌표로 주어지고, 픽셀 값 자체도 실수로 주어집니다.

그와 반대로 디지털 영상은 픽셀위치가 정수좌표, 픽셀값도 정수로 주어집니다.

 

20세기 중반까지는 아날로그 영상에 대한 영상처리가 주를 이뤘지만

컴퓨터 처리속도의 향상으로 인해 이런 기법들은 디지털 영상 처리 기법으로 많이 대체됐습니다.

 

디지털 영상처리는 다양한 방법으로 쓰일 수 있고, 정확하고, 구현도 쉽습니다.(아날로그 영상에 비해)

추가로 전송도 가능하고, 기술의 발전가능성도 높고, 영구적으로 저장도 가능합니다.

아날로그영상에 비해 장점밖에 없으므로 사람들은 디지털 영상만 다루게 됩니다.

즉, 오늘날의 영상처리는 디지털 영상에 대한 처리를 말하는것입니다.

영상처리는 여러가지 목적으로 쓰입니다.

영상을 변형 또는 가공을 통해 보정된 영상(ex.포토샵)을 만들어낼 수 도 있고,

영상에서 필요한 정보를 추출해서 ID 정보(ex.지문인식)로 사용할 수 도 있습니다.

 

영상처리의 분류

획득 정보의 수준에 따라 영상 변환 - 영상 분석 - 영상 인식 3단계로 분류할 수 있습니다.

물론 더 잘게 나눌 수 도 있습니다.

개선 - 복원 - 변환 - 분석 - 인식 - 압축 등 6가지로 나눌 수 있지만 이번 포스트에서는 위의 3단계로 나뉩니다.

 

1) 영상 변환 : 입력 영상을 목적에 맞게 변형, 가공

- 영상 품질 향상

- 밝기, 명암, 색상 변화

- 모양, 크기 변환

- 각종 효과(ex.필터어플)

 

2) 영상 분석 : 영상 고유의 정보, 수치, 특징 등을 파악하는것

- 경계선, 모서리 추출

- 3차원 깊이 정보 측정 등

 

3) 영상 인식 : 영상 내용에 대한 정보 획득

- 사람처럼 영상을 보고 어떤 영상인지 인식하는 것

- 영상 자체의 정보가 아니라 영상 속의 정보(피사체) 식별, 범주 분류

- 물체 검출, 물체 분류, 물체 추적

- 장면 인식, 행동 인식

 

 

요즘은 GAN같은 딥러닝 모델을 사용해서 모방의 개념이긴 하지만 영상 창조까지 가능하니,

나중에는 영상창조까지 4단계로 분류할 수 도 있을것 같습니다.

 

혹시 최신 영상처리 책에서는 이미 이렇게 분류되고 있나요?

이전 전공책을보고 정리하는거라 최신 전공책을 나중에 뒤져봐야겠습니다.

영상의 구조

영상은 2차원 평면 공간 (x, y)상의 함수 I (x, y)

쉽게 말하면 2D 공간에서 하나의 공간(x, y)마다 하나의 값(픽셀 값)을 가지는 데이터를 영상이라 합니다.

사진의 색상을 어떻게 표현하냐에 따라 데이터의 양이 다릅니다. (보통 gray or rgb)

 

실행속도를 위해 코드상에서는 1차원 배열로 사용되기도 합니다.

보통 전공수업에서는 2차원 구조를 토대로 MFC 및 OPENCV에서 프로그래밍하여 영상처리를 합니다.

 

영상 변환

앞서 말했듯이 영상 변환은 입력 영상을 목적에 맞게 변형, 가공하는것을 의미합니다.

영상 변환의 예시는 다음과 같습니다.

- 영상 품질 향상

- 밝기, 명암, 색상 변화

- 모양, 크기 변환

- 각종 효과(ex.필터어플)

 

영상 밝기, 명암, 색상, 감마 등 은 픽셀값을 사칙연산하여 간단하게 조정할 수 있습니다.

 

밝기 조정 : 픽셀값을 전체적으로 더하면 밝기가 올라갑니다 (당연하지만 어둡게하는건 반대입니다.)

 

명암 조정 : 픽셀값을 2배 곱해버리면 어두운 부분은 더 어둡게, 밝은부분은 더 밝게되어 명암 조정이 가능해집니다.

픽셀값은 최대 255이므로 그냥 2배를 곱하면 전부 최대값이 되버릴 수 도 있으므로 보통 어느정도 빼고 2배로 곱합니다.

(ex. (원본이미지 - 10) * 2), 물론 자동으로 명암이 0~255 구간을 활용할 수 있도록 구현할 수 도 있습니다.

 

감마 보정 : 일반적인 모니터는 명암을 강조하는 특성이 있는데, 출력 밝기를 원하는 수치에 가깝도록 입력 신호 세기를 보정하는것을 감마 보정이라고 합니다.

 

색상은 그냥 rgb값을 조정하면 됩니다.

 

영상 품질 향상을 위한 영상 잡음 제거는 약간의 기본개념이 필요합니다.

영상 잡음

영상 잡음의 종류로는 양자화 잡음, 가우스 잡음, 소금(후추) 잡음이 있습니다.

 

양자화 잡음 : 아날로그 신호를 디지털 신호로 변환하는 과정에서 생기는 잡음을 의미합니다.

오버샘플링하여 해결할 수 있습니다.

오버샘플링이란 Nyquist 주파수(fs=2fm)보다 훨씬 높은 주파수로 표본화하는 것을 말하며

이미 Sampling된 신호를 다시 Sampling 하는 것

 

가우스 잡음 : 카메라 센서의 전기적 신호 증폭 과정 등에서 발생

평균값 필터(컨폴루션 연산을 통해 이상치를 줄여줌) 와

가우스 필터(필터의 중앙에 있을수록 가중치 부여, 평균값 필터는 모두 동일하게)를 사용해서 해결

가우스 필터는 마스크 크기가 증가할수록 시간이 오래걸려서 1차원 가우스 필터를 2회 수행하는것으로 구현

 

소금(후추) 잡음 : 신호의 변환 또는 전송과정에서의 오류로 발생

중간값 필터을 사용해서 해결

 

히스토그램 평활화

히스토그램 : 픽셀 밝기 값의 분포를 표현한 것

밝기 값과 누적 합이 비례하도록 조정하여 히스토그램 평활화할 수 있습니다.

영상의 가시성을 높히기 위해 해주는 작업입니다.

 

마스크

영상에 마스크를 씌우는 컨볼루션 연산을 통해서 윤곽선 강조 및 추출

 

프르윗 마스크, 소벨 마스크 : 가로 세로 윤곽선 추출

프르윗 보다 소벨이 좀 더 윤곽선이 강조됩니다. (필터의 중간에 가중치를 좀 더 줘서)

 

엠보싱 마스크 : 대각선 윤곽선 추출

 

라플라시안 마스크 : 전체 윤곽선 추출

 

언샤프 마스크 : 영상을 날카롭게 강조

윤곽선 성분을 제거하고, 윤곽선이 아닌부분은 강조되서 날카롭게 보입니다.

(이름이 언샤프지만 실제로는 샤프하게 보이게 하므로 헷갈리지 않게 주의하시기 바랍니다.)

 

보간법

픽셀 값의 보간 : 소수점 위치에 해당하는 픽셀 값의 추정

사진을 확대할때 픽셀값이 1대1이 아니므로 없는 값이 존재하게 됩니다. 이를 보간해주어서 확대를 완료합니다.

 

보간법을 보간 품질에 따라 정리하자면 (보간법 사진을 확인해야 이해가 빨리 됩니다)

최단 입점 보간 : 가장 가까운 원본 픽셀을 선택하여 보간 (계단현상이 생길 수 있음),

 

쌍선형 보간 : 가로와 세로 방향에 대하여 직선으로 두 점 사이의 값(내분점)으로 보간,

 

입방 회선 보간 : 가로, 세로 방향의 4개의 정수 좌표영역에서 16개의 픽셀을 뽑아서 3차 함수 가중치로 보간

 

쌍입방 보간 : 4개의 정수 좌표 사이의 영역을 곡면으로 근사(미분)하여 보간,

정수 좌표에서 미분값을 이용하여 3차 곡면 근사(미분)한 후 16개의 점에 16개의 가중치를 곱한 후 더하면 최종 결과가 얻어집니다.

 

4개의 보간법은 보간 품질이 올라갈수록 계산 시간은 증가합니다.

 

영상의 평행 이동과 회전, 확대 및 축소 변환

평행이동은 매우 간단합니다.

그냥 픽셀값만 바꿔주면 됩니다. 따로 설명을 추가하진 않겠습니다.

 

회전은 입력영상의 좌표에 삼각 함수를 곱해주면 됩니다.

점의 회전이동 공식과 같습니다.

확대 및 축소 변환도 간단합니다.

늘리거나 줄이고싶은 값만큼 픽셀에 곱해주면 됩니다.

 

복합 변환이라고 영상의 중심을 기준으로 회전하는 변환도 있습니다.

위의 사진에 나온 공식은 0,0 좌표를 기준으로 회전하는 공식인데 이걸 조금만 이용하면 됩니다.

 

1) 입력영상의 중심을 0,0 좌표로 평행이동 ->

2) 회전이동 ->

3) 이전에 평행이동 한 만큼영상의 중심으로 평행이동

해주면 됩니다.

 

행렬을 이용해서 이동, 회전, 확대/축소 변환을 한꺼번에 수행할 수 도 있습니다.

 

주파수 영역에서의 영상처리

주파수란 신호가 떨리는 빈도를 의미합니다.

 

영상의 주파수 영역

높은 주파수(고주파) : 밝기 값의 변화가 많다.

낮은 주파수(저주파) : 밝기 값의 변화가 적다.

 

간혹, 오해할 수 도 있는데

영역이 밝기가 얼마나 밝은지로 따지는게 아니라, 얼마나 자주 변하는지로 나뉩니다.

 

창밖을 연 풍경찍은 사진을 예로 들었을때

구름없는 하늘은 저주파영역, 다양한 건물이 보이는 지상이 고주파 영역입니다.

 

물론 저주파 영역이여도 저주파만 들어있진 않습니다.

사진의 모든 영역에는 고주파와 저주파가 모두 들어있지만,

밝기 변화가 없는 영역은 저주파가 많이 들어있어서 저주파 영역이라고 부르는 것 입니다.

 

사진의 영역을 주파수 분석(이산 코사인 변환(DCT))을 해준다면

저주파와 고주파 성분을 구분할 수 있습니다.

 

주파수 변환

입력신호를 주파수 기저함수(sin, cos 함수 등)의 선형 조합으로 표현

입력신호를 주파수 성분의 계수로 나타낼 수 있고, 그 반대가 될 수도 있습니다.

 

푸리에 변환 (DFT)

기저함수로 허수를 지수로 하는 함수 사용 (오일러 공식 사용)

푸리에 변환을 이용해서 주파수 신호와 원본 신호를 상호변환할 수 있습니다.

 

푸리에 변환이 아니라 이산 푸리에 변환을 사용하는 이유는

푸리에 변환은 신호가 연속적이어야 되는데 디지털 신호 처리장치는 모든 자료를 연속적으로 저장할 수 없고,

이산적으로 저장되기 때문에 이산 푸리에 변환을 사용합니다.

 

이산코사인변환(DCT)는 실수로만 결과물이 나오고, DFT는 복소수로 결과물이 나옵니다.

DCT가 DFT보다 적은 계수로 신호를 재생하는 능력이 좋습니다.

그러므로 영상 압축에서는 DCT가 주로 쓰입니다.

고속 푸리에 변환 (FFT)

이산 푸리에 변환의 중복 계산을 제거

기저 함수(sin cos와 같은 삼각함수)는 주기성을 띄므로 중복연산이 생기는데,

이 계산을 생략해서 O(n^2)의 시간 복잡도를 O(n*logn)으로 줄일 수 있습니다.

단, 2원소 DFT를 여러번 거치는 방법이기 때문에 입력신호의 길이가 2의 거듭제곱이 되어야 합니다.

 

가로방향으로 계산하면 1바이트씩 옆으로 옮길 수 있음에 비해 세로방향은 점프를 해야되기 때문에

가로방향의 변환결과를 전치(transpose)하여 세로 방향 변환의 입력으로 사용합니다.

 

즉, 가로방향 FFT -> 전치 -> 세로방향 FFT -> 전치 의 과정을 거치게 됩니다.

 

주파수 통과 필터

특정 주파수 성분만 통과시키는 필터

이전에 설명했던 마스크와 똑같은 개념입니다.

픽셀에서 직접해주었던 마스크 작업을 주파수 영역에서 실행하기 때문에 좀 더 간단하게 해줄 수 있습니다.

 

고주파 통과 필터(HPF) : 고주파만 통과시키는 필터 

- 윤곽선(경계선)만 남음 (필터의 안쪽 성분만 0으로)

 

저주파 통과 필터(LPF) : 저주파만 통과시키는 필터 

- 영상을 블러할 수 있음 (필터의 바깥쪽 성분만 0으로)

 

가우시안 주파수 필터

이상적인 필터는 주파수 성분이 차단 주파수를 기점으로 급격하게 변화하기 때문에 영상에 물결효과가 발생합니다.

이를 방지하기 위해 주파수를 천천히 변화시켜서 필터 품질을 향상시킬 수 있습니다.

 

고주파필터 저주파필터의 역할을 모두 할 수 있는데 이전처럼 필터 부분을 0으로 설정하지 않고,

가우스 함수 가중치를 사용해서 정규분포에 따라서 필터부분을 설정합니다.

 

영상 압축

영상 압축의 필요성

고화질 동영상은 고화질 사진을 여러개 이어 붙인 형태입니다.

만약 하드디스크에 1920 * 1080 픽셀의 60프레임짜리 고화질 동영상을 저장한다고 치면

1920px * 1080px * 3 (RGB 채널이 3개) 

프레임당 6.2Mbyte이고, 초당 60프레임이므로 1초에 373Mbits의 저장공간을 사용합니다.

1분짜리 영상만 되도 22.4Gbyte 크기의 영상이 됩니다.

 

1900년대에도 디지털 영상이 존재했는데, 이때는 저장장치의 용량이 현재보다 현저히 낮았습니다.

그때부터 영상 압축기술이 등장했고, 현재는 고화질 컬러 영상들을 저장하고, 전송하기 위해 영상 압축이라는 기술이 더욱 발전했습니다.

 

영상 압축이 가능한 이유

이미지 데이터는 상관관계(correlation)이 매우 높습니다.

1. 공간적 (Spatial domain) 상관성 : 정지영상의 경우

2. 시간적 (Temporal domain) 상관성 : 동영상의 경우

 

결론 : 이미지 데이터는 redundancy(중복성, 용장도)가 매우 높다.

그러므로 redundancy를 제거하면서 효율적으로 영상을 압축할 수 있습니다.

1. 공간적 상관성 -> Transform Coding(DCT)

2. 시간적 상관성 -> Differential Coding

 

RGB값 조정

사람의 눈이 물체의 색을 인식할때 색상보다는 밝기차이에 민감하고, 빛의 3원색 중 녹색의 밝기에 더 민감합니다.

디지털 컴포넌트 비디오신호의 국제 표준인 ITU-R BT.601에 따르면

Red 29.9% Green 58.7% Blue 11.4% 약 3 : 6 : 1의 비율로 가중치를 두어 전체적인 화면의 밝기값(Y)을 계산합니다.

이렇게 계산한 밝기값 Y와 Blue, Red의 색차를 계산해서 Cb, Cr이라고 부릅니다.

위 데이터들을 이용해서 YCbCr 컬러스페이스 (변환값)를 계산합니다.

그리고 데이터 비율을 Y를 4: Cb 1: Cr 1  (또는 4: 2: 2)로 설정하면 사람의 눈에는 큰 차이가 없게 보입니다.

이 과정을 서브샘플링이라고 부릅니다.

여기까지는 기존의 아날로그 TV에도 사용되는 기법입니다.

 

정지영상 압축 (JPEG : Joint Photograph Experts Group)

Spatial redundancy의 제거 : Transform Coding(DCT)

DCT -> 양자화 -> 엔트로피 코딩 과정을 거쳐서 압축시킵니다.

 

1) DCT - 무손실 압축

DCT는 위의 주파수 변환 파트에서도 설명했지만 영상의 픽셀값을 주파수로 분해하여 나타내는 것 입니다.

(이때 영상을 작은 블록 (block size : 8*8 or 16*16)으로 나누어서 블록별로 DCT하여 계산량을 줄입니다.)

중복성 식별 및 고주파 제거가 주 목적입니다.

 

2) 양자화 - 손실 압축

DCT 결과로 얻은 실수 계수를 제한된 비트 수 (레벨 수)로 표현하는데, 할당되는 비트 수 (레벨 수)에 따라 손실 정도가 결정됩니다.

레벨 별로 할당하는 불가역적 연산때문에 손실율이 큰 손실압축 입니다.

스텝 사이즈가 클수록 출력 레벨 수는 적어지고, 필요한 비트수가 줄어 듭니다. (고압축, 저품질)

고주파일수록 스텝사이즈를 크게 잡아서 데이터를 줄일 수 있습니다.

Low freq. : small step size -> more bits

High freq. : large step size -> less bits

 

 

3) 엔트로피 코딩 - 무손실 압축

양자화된 결과를 통계적/확률적 특성을 이용하여 무손실로 더욱 압축합니다.

기준이 되는 1개의 DC계수와 이전 압축 블록의 DC계수의 차이값을 구해 Differential Coding을 해줍니다.

Zig-zag scan -> Run-length coding -> Huffman coding

63개의 AC 계수들을 지그재그 순서로 Run-length 코딩, 하프만 코딩을 적용하여 더욱 크기를 줄인다.

(1) Zig-zag scan : 양자화된 2차원 계수를 1차원 시퀀스로 만듦 -> 후반부에 0이 많아서 Run-length 코딩에 유리함.

 

(2) Run-length coding : 지그재그 시퀀스를 0이 아닌 숫자를 기준점으로 하여

(앞에 있는 0의 길이, 0이 아닌 상수의 값) 형태로 표현

(3) Huffman coding : 하프만 코딩

확률적으로 자주 발생하는 값에는 비트 수를 적게 할당 -> 데이터가 압축될 확률이 높아짐

Human Visual System의 특성을 고려

Emphasis on low frequency : 저주파 강조

분해된 주파수 중 높은 주파수는 사람들은 잘 인식못하므로, 높은 주파수는 제거하는 과정을 거쳐서 한번 더 압축시킵니다. (양자화)

 

Emphasis on luminance : RGB값 조정

사람의 눈이 물체의 색을 인식할때 색상보다는 밝기차이에 민감하고, 빛의 3원색 중 녹색의 밝기에 더 민감합니다.

디지털 컴포넌트 비디오신호의 국제 표준인 ITU-R BT.601에 따르면

Red 29.9% Green 58.7% Blue 11.4% 약 3 : 6 : 1의 비율로 가중치를 두어 전체적인 화면의 밝기값(Y)을 계산합니다.

이렇게 계산한 밝기값 Y와 Blue, Red의 색차를 계산해서 Cb, Cr이라고 부릅니다.

위 데이터들을 이용해서 YCbCr 컬러스페이스 (변환값)를 계산합니다.

그리고 데이터 비율을 Y를 4: Cb 1: Cr 1  (또는 4: 2: 2)로 설정하면 사람의 눈에는 큰 차이가 없게 보입니다.

이 과정을 서브샘플링이라고 부릅니다.

JPEG 인코더의 압축 과정

입력영상 -> DCT -> 양자화 -> 엔트로피 인코딩 -> 압축된 영상

JPEG 디코더의 복원 과정

압축된 영상 -> 엔트로피 디코딩 -> 역양자화 -> IDCT -> 복원된 영상

 

동영상 압축 (MPEG : Moving Picture Experts Group)

정지영상의 압축/복원 알고리즘(JPEG)을 동영상에 적용시키면서 시작됨

정지 영상의 공간적 상관성은 JPEG 기법을 그대로 적용하여 압축

공간적 압축뿐만 아니라, 시간적 압축 기법을 적용

(Differential coding, motion estimation, compensation)

 

MPEG 알고리즘 : JPEG + Differential Coding + Motion Estimation

 

DIfferential Coding (동영상)

기준이 되는 프레임과 그 뒤에 따라오는 프레임들의 차이가 나는 픽셀값만 저장(중복 제거)하면 영상을 더욱 압축할 수 있습니다.

기존에는 전송 도중 에러가 발생하면, 첫번째 정보를 모르면 decoding이 불가했습니다.

이를 해결하고자 Periodic reset (주기적 재설정)을 도입했습니다.

 

Periodic reset : I-Frame

이전에는 첫 프레임을 기준으로 프레임들의 차이를 일렬로 나열했다면, 이제는 영상 사이마다 기준이 되는 프레임을 설정하는 기법입니다.

기준이 되는 프레임을 I-Frame(or KeyFrame)이라고 부르고, 다음 움직임을 예측한 프레임을 P-Frame이라고 부릅니다.

그리고 I-Frame과 P-Frame 사이의 움직임을 예상하여 화면이 좀 더 부드럽게 이동할 수 있도록 해주는 프레임을 양방향 예측 프레임, B-Frame이라고 부릅니다.

이 P 프레임은 (I 프레임의 33% 용량), B 프레임(P 프레임의 33% 용량)은 변화가 예측되는 부분만 저장을 하기때문에 데이터를 크게 압축시킬 수 있습니다.

 

M개의 프레임으로 구성된 GOP(Group of picture)를 단위로 I,B,P의 압축방법이 반복됩니다.

 

Motion estimation

동영상을 일정 크기의 블록으로 나누어 보면 각 블록의 영상은 이전 영상의 같은 위치 또는 주변 위치와 유사한 경우가 대부분입니다.

따라서 같은 위치에 대한 단순 차 영상을 이용하는 것보다, 이전 영상에서 가장 유사한 부분과의 차 영상을 이용하는것이 효과적입니다.

 

계산과정

블록 전체의 차이가 가장 작은 블록(최정합 블록)을 찾아서 그 위치를 벡터로 표현