복습
- Huffman coding : 무손실 압축 -> 그러나 압축률이 작음
- 압축률이 작아서 손실이 있는 압축을 구현 -> DCT를 한 후 고주파성분을 없애기위해 Quantization을 적용
- DPCM : 차성분을 보냄
- fft와 dct 중 dct를 선택한 이유 : pixel값에 대하여 fft -> ifft를 한경우와 dct -> idct한 경우를 비교
- fft, dct를 하고 아래쪽을 잘라서 invers해보면 fft보다 dct가 더 원래값과 비슷함
- fft는 실수와 허수로 표현하여 위상과 magnitude를 알 수 있음, dct는 실수로만 표현되어 위상을 표시못함 -> 이미지 프로세스에는 위상이 필요없기에 그냥 dct만 사용하는 것이지 다른 용도에서는 fft를 사용하기도 함
- DCT는 이미지 크기가 어떤 것이든 사용 할 수 있지만 수행시간을 줄이기 위해 8x8로 이미지를 나누어 각자 따로 수행
- 8x8만큼 잘라낸 이미지에 128을 빼주고 dct를 행함 -> 2차원 dct에서 왼쪽 상단의 값들만 있어도 어느정도 복구가 됨
- Quantization matrix로 각 자리의 값들을 나눠서 고주파성분을 버림 -> 압축률을 높이는 경우에는 matrix에 q값을 곱하여 높일 수 있고, 원본값과 최대한 같게 하기 위해서 q값을 줄여서 곱하여 고주파성분을 어느정도 살릴 수 있음
- 가장 처음에 있는 값은 DC성분으로 DPCM(각 8x8그룹들의 DC성분들만 뽑아서 이전값과 빼주면서 전송 -> 가장 첫번째 값은 이전값이 128이라고 생각함)을 행함
- ZIGZAG방식으로 순서를 기록
- PSNR = 20log10(255/루트(원래값 - 복구값))
- 최종적으로 나온 코드 -> 테이블을 참고하여 나온 값들 -> 총 60bit일때 압축률을 구해보면
- (8x8 x 8bits)/60bits = 8.5
- 60/64 = 0.94 -> 이값은? 픽셀당 0.94bit만큼 필요하다는 의미 - 총 pixel개수가 64bit인데 이를 60bit로 압축 했기 때문에 1bit보다 적은 값이 필요
sub-sampling
- RGB를 표시할 때, 3채널을 전부 처리하여 합쳐야 했기에 수행시간이 오래 걸린다는 것을 배웠음
- 이 문제를 해결하기 위해 Y Cb Cr로 바꿔서 한 채널만 처리하면 시간이 줄어들지만 압축을 하는 경우에는 왜 나머지 두 채널을 압축하지 않는가?
- -> Cb Cr은 인간이 구분하지 못하는 채도성분이기 때문에 YCbCr중 Y는 전부 보내고 CbCr부분은 Y값 2개당 하나씩 넣어서 반으로 줄임 - 512x256
- Y 4개당 CbCr 1개로 하는 경우도 있음 -> 256x256
- no subsampling을 하는 경우는 4:4:4라고 표현 두 번째 경우는 4:2:2 마지막 경우는 4:2:0이라고 부름
- 얼마나 수행시간이 줄어들었는가?
- 128x128의 경우 8x8로 나누면 16x16개의 그룹이 생김
- 16x16 DCT x 3ch에서 16x16 + (8x8x2) -> Y는 그대로 나머지 두 채널은 4:2:0으로
- 압축에 대한 고찰
- code bits per pixel
- compression Ratio
- 2-D DCT 연산을 1-D DCT 연산으로 두 번 해주면 수행시간이 줄어들 수 있음
Video Coding
- 어느 순간의 비디오 클립을 여러장 나열해서 보면 움직이는 물체는 정해져있고 나머지 값들은 동일
- 시공간적인 redundancy가 존재하므로 이전값과 빼서 차성분을 인코딩하는 방식도 있음 -> temporal redundancy
- 차성분이 이전과 현재의 움직임을 담고 있으므로 좀 더 줄일 방법을 찾음 -> 현재 프레임의 움직인 블록은 이전 프레임의 어딘가에 존재한다고 생각함
- 그러므로 현재 프레임의 움직인 블록크기 만큼 전체 이미지를 잘라내어 이전 프레임의 어느 블록에 있었는지 예측하는 방식을 사용 -> motion estimation : 이전 프레임에서 가장 유사하다고 판단되는 것을 찾음
- 만약 움직임이 없었다면 현재와 동일한 위치에 있을 것이고 움직였다면 조금 다른 위치에 있었을 것 -> 움직임을 motion vector라고 함
- 일정 범위를 정해놓고 위치를 찾는 것 -> motion estimation
- motion vector와 차성분 모두 전송해서 처리
- true motion vector가 아닐 수도 있고 압축을 많이 해야하는 경우에는 시간이 오래걸리지만 차성분만 압축하므로 이 방식을 사용
MPEG encoding process
Wavelets
- 파형의 부분적인 조각
- 아래 그래프는 위의 파형(wave) 중 한 부분만을 본 파형(wavelet) -> exp를 곱해주어 주변값들을 0으로 만들어버림
- 패턴은 유지하면서 늘어나게 하거나 좁힐 수 있음
- 더하거나 빼주어서 왼쪽, 오른쪽으로 옮길 수 있음
- 곱해주어 크기를 높이거나 줄일 수 있음
A Simple Wavelet Transform
- input numbers : a, b
- sum : s = (a+b)
- Difference : d = a-b
- s와 d를 줬지만 a와 b는 어떻게 알 것인가
- (s + d) / 2
- (s - d) / 2
- 더 많은 값들?
- 더한 값을 앞에 뺀 값을 뒤에 써줌
- 더한 값들만 가지고 반복
- 반복하여 마지막에는 앞부분이 커지고 뒷부분은 작아짐 -> 고주파성분과 저주파성분
- 반대로 돌아가려면?
- 만약 0 이하를 모두 0으로 처리해도 대체적으로 비슷하게 존재
- DCT는 sub-block을 잘라내어 압축하는데 나중에 복원 했을 때, 잘라낸 경계선이 보이게 됨 -> 매끄럽지 않음(blocking)
- 이러한 현상을 없애기 위해 low-pass filter도 적용시키는 경우가 있음
- 전체 이미지를 통째로 wavelet을 한다면 low-pass와 같은 효과가 나타남
- 예제
- 수평방향으로 한 번, 수직방향으로 한 번 wavelet해줌
- 저주파성분과 고주파성분이 확실하게 구분됨
'영상처리' 카테고리의 다른 글
chapter 10 - Morphological Operators (0) | 2018.12.11 |
---|---|
[11월29일]JPEG 압축, 복원 (0) | 2018.11.29 |
[11월27일]IMAGE CODING AND COMPRESSION (0) | 2018.11.27 |
[11월22일]chapter13 - Color Processing (0) | 2018.11.23 |
[11월14일]2차 Derivative에 따른 edge 검출 (0) | 2018.11.23 |