JPEG.
- 높은 압축 효율.
- 그래픽 이미지 압축에 관한 표준
- JFIF : 누구나 사용할 수 있도록 public domain에 공개되있다.
- 높은 압축률을 구현하기 위해 사람 눈이 구분하지 못할 정도로 미세하게 데이터를 생략하는 방식을 사용.
- 여러가지 모드
> Sequential 방식 : 그래픽 이미지 맨 위부터 아래로 순차적으로 데이터를 저장하는 방식
> Progressive 방식 : 그래픽 이미지를 여러번 스캔하여 점진적으로 이미지가 뚜렷하게 보이도록 하는
방식. 일단 전체 이미지를 출력.(포커스가 제대로 맞지 않은 사진처럼 흐릿한 이미지를 출력) 그 다음 출력 때 점점 포커스가
맞추어지는 것처럼 보다 명확한 이미지를 출력한다.
> Hierachical 방식 : progressive 방식보다 진보된 형태. 같은 그래픽 이미지를 표현하고 있지만 화질
이 서로 다른 이미지를 frame 단위로 여러 개 저장하는 방식이다.
> Lossless 방식 : 화질 저하가 없는 방식. 압축을 하지 않고 화질의 변화를 주지 않는 방식이다.
- Huffman 코딩 : JPEG 그래픽 데이터를 압축해서 저장하기 위해 사용하는 압축 방식.
- Arithmetic : Huffman 코딩 방식과 똑같은 코딩방식. 구현방법만 다르다.
- JPEG 그래픽 이미지는 각 픽셀의 색상을 8bit or 12bit로 표현할 수 있다.
- 가장 널리 사용되는 방식 - Sequential, Huffman, 8bit 방식.
- JPEG 파일의 원리
:JPEG파일은 Sampling -> DCT -> Quantization -> Huffman coding 의 방식을 거쳐 압축이 된다.
> Sampling : RGB 색상 체계를 Y-Cb-Cr 색상 체계로 변환하는 과정.
>> 이때 Cb, Cr 성분을 구할 때 일부 성분들은 생략됨으로 압축의 효과를 가져온다.
> DCT : 샘플링된 데이터를 코사인 함수의 합으로 변환하는 과정이다. 이렇게 변환된 데이터에서 원래 데이터를
크게 변화시키지 않을 만큼 불필요한 성분들을 제거한다. = 양자화(Quantization).
양자화를 거쳐 압축된 데이터는 Huffman 콛이이라는 압축 알고리즘을 통해 압축이 된다.
(= 양자화 과장에서 한번 압축이 일어나고, Huffman 코딩에서 또 한번 압축이 일어남 -> 압축 효율 극대화)
>> 양자화에 의한 압축은 원래 데이터를 일부 제거하기 때문에 JPEG 이미지의 화질저하의 원인.
(Huffman 방식은 Lossless 방식이라 화질저하와는 관련 없다)
:압축된 JPEG 이미지를 복원하기 위해서는 위의 과정을 역순으로 행한다.
> Huffman 디코딩을 통해 압축을 풀어 양자화된 데이터를 얻는다
> 양자화된 데이터는 역 양자화(de-Quantization)을 통해 원래 DCT성분으로 복원된다.
> 복원된 DCT성분들은 IDCT변환을 통해 Y-Cb-Cr데이터로 변환된다.
> Up-Sampling 과정을 통해 다시 RGB색상 체계로 변환되어 원래 모습을 찾게 된다.
- 색상 체계 : JPEG 파일이 사용하는 색상 체계는 Y-Cb-Cr 색상 체계로, Y는 밝기, Cb,Cr은 색상을 나타낸다.
Y,Cb,Cr은 모두 0에서 255의 범위를 가진다.
> RGB -> YCbCr, YCbCr -> RGB로 변환하는 공식.
: Y = 0.299 R + 0.587 G + 0.114 B
: Cb = -0.1687 R - 0.3313 G + 0.5 B +128
: Cr = 0.5 R - 0.4187 G - 0.0813 B + 128
: R = Y + 1.402 (Cr-128)
: G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
: B = Y + 1.772 (Cb-128)
JPEC 파일은 YCbCr 세 개의 성분 가운데 어느 한 성분(보통 Y성분)만 저장하거나 세 성분 모두 저장할 수
있다. Y성분만 저장하는 것은 256 level gray 색상으로 저장하는 것을 의미한다. 실제 JPEC 파일에
Y,Cb,Cr 데이터가 저장될 때는 128씩 뺀 값이 저장된다.
- Sampling : 다른 그래픽 파일들은 한 픽셀의 색을 나타내기 위해, R,G,B 생상 체계를 사용하였으며 3가지 성분 모두
같은 비율로 저장되었다. 하지만 JPEG파일에서는 Y,Cb,Cr이 서로 다른 비율로 저장될 수 있다.
ex. 매 픽셀의 Y성분을 모두 저장하는 반면, Cb,Cr은 학 픽셀씩 건너 뛰면서 저장할 수도 있다.
이와 같이 전체 픽셀가운데 일부 픽셀의 데이터만 선별하여 저장하는 방식을 sampling이라고 한다.
> 샘플링 주기(Sampling Frequency) : JPEG 파일의 샘플링 간격을 나타내는 방식. 각 성분의 샘플링
간격의 역수비로 나타낸다. Y성분은 매 픽셀마다 샘플링하고 Cb성분은 두 번째 픽셀마다 샘플링하고 Cr성분은
네번째 픽셀마다 샘플링한다면 YCbCr의 샘플링 주기는 4:2:1이 된다. (JPEG 파일이 허용하는 최대 샘플링
주기는 4이다.)
가로 방향의 샘플링 주기와 세로 방향의 셈플링 주기가 틀릴 수도 있다.
JPEG 파일에서 주로 쓰이는 샘플링 주기는 2:1:1 or 1:1:1이다. (각 성분의 샘플링 주기를 다르게 하는
이유는 화질을 크게 떨어뜨리지 않고 데이터의 양을 줄이기 위해서) 가로, 세로방향의 YbCbCr 샘플링 주기를
각각 2:1:1fh 로 하면 1:1:1로 하는것보다 화질은 저하되지만 데이터의 양을 반으로 줄일 수 있다.
이와 같이 일부 픽셀 데이터만 샘플링 하는것을 Down-sampling이라고 한다. (<-> down sampling된
데이터를 원래 픽셀 개수로 늘이는 것을 Up-sampling이라고 한다.)
- DCT와 양자화 : DCT란 (Discrete Consine Transform = 이산 코사인 변환)의 약자로 JPEG 압축 기술의
핵심이라 할 수 있다. DCT는 임의의 데이터 배열을 코사인 함수의 합으로 표현할 수 있다는 성질을 이용한 것이다.
- Huffman Coding : 보통 한 픽셀 데이터의 길이는 8bit로 고정되어 있는데 Huffman 코드는 데이터의 빈도수에
따라 그 길이가 다르다. 빈도수가 많은 코드일수록 짧기 때문에 길이가 고정된 경우보다 전체 데이터의 크기가 작은 것이다.
> JPEG 파일은 code length를 이용한 방법으로 Huffman코드를 만든다.
1. 데이터 배열에서 각 데이터들의 빈도수를 구한다.
2. 데이터들의 빈도수를 이용해 코드의 길이를 구한다.
>> 각 데이터들의 코드 길이를 나타내는 변수를 하나씩 할당해주고 모두 0으로 초기화해준다.
>> 가장 빈도수가 작은 데이터 두 개를 골라 합친다.
>> 각 데이터의 빈도수의 합을 새로운 빈도수에 넣어주고 코드 길이를 1씩 증가시킨다.
>> 모든 데이터가 다 합쳐질 때까지 반복한다. (최종적으로 남은 코드 길이 = Huffman코드길이)
3. 코드 길이를 이용해 Huffman 코드를 구한다.
'삽질의 현장 > - ETC' 카테고리의 다른 글
[삽잡이::Framework] Robot Framework에 대해서 알아보기전에 Framework는 뭔데? (0) | 2015.06.19 |
---|---|
[삽잡이::JPEG] JPEG에 대해서...(2) (0) | 2014.01.20 |
[삽잡이::Socket] Socket 프로그래밍 구조 (client) (0) | 2013.09.16 |
[삽잡이::Socket] Socket 프로그래밍 구조 (server) (0) | 2013.09.15 |
[삽잡이::Socket] 주소체계 (0) | 2013.09.15 |