#1. [H.264] 동영상 압축의 기본 개념
#2. [H.264] 동영상 압축의 기본 개념 – RGB, YCbCr, 서브샘플링
#3. [H.264] Block-based Motion Estimation(ME)
#4. [H.264] Discrete Cosine Transform(DCT) 이산 코사인 변환
#5. [H.264] Quantization(양자화)과 Zig-zag scanning

안녕하세요? 맨날맑음 입니다.

이전 포스팅에서는 동영상의 정의와, 동영상을 압축하는 기본적인 방법에 대해 간단히 살펴 보았습니다.
이번 시간에는 동영상을 압축하는 자세한 방법을 알아보기 전에 색공간 RGB, YUV(YCbCr) 그리고 YUV 서브샘플링에 대해 알아 보도록 하겠습니다.

본론으로 들어가기 전에 간단하게 색공간(Color Space)에 관해 알아 보도록 하겠습니다.
위키의 설명에 보면 색공간은 색표시계를 3차원으로 표현한 공간 개념이라고 나와있습니다. 즉 색을 표현하는 방법은 여러가지(RGB, CMYK, HSV, CIE, YCbCr 등)가 있는데 각각이 색을 표현하는(담는) 방법이라고 생각해도 될 것 같습니다.

#1. RGB 색공간

-그림1. RGB 채널의 원리 -

빛의 삼원색(빨강, 녹색, 파랑)을 이용하여 색을 표현하는 방법 입니다. 원색 신호라고도 불립니다. 일반적으로 TV나 모니터, HTML의 색상표현에 쓰이며,  컴퓨터의 모니터는 RGB방식을 사용하므로, 우리가 영상을 화면에 디스플레이 하기 위해서는 RGB로 변화 하여야만 합니다. 각 값들은 0~255까지의 값(8bit)을 가지고 있으며, 각 값들을 가산 혼합하여 색상을 표현합니다.

#2. YCbCr 색공간

-그림2.  YCbCr 이미지의 구성요소-

YCbCr에서 Y는 휘도(빛의 양)이고, Cb와 Cr은 색차(크로마)를 나타냅니다. 색차 신호라고도 불립니다.이 방식은 RGB보다 색상의 분리 및 전달 효과는 약하지만, 적은 데이터로 보다 많은 색상을 나타낼 수 있는 장점을 가집니다.

YUV를 사용하는 대표적인 기계는 텔레비전입니다. 지금은 전부 칼라 텔레비전이지만, 예전 흑백의 경우 휘도(밝기)만을 가지고, 방송을 하다가, 컬러TV는 CbCr성분을 더해서 방송을 하기 때문에 지금에 와서도, 흑백 TV를 볼 수 있는 이유입니다. Y 성분만 뽑아 쓰면 되니까요.

이 방식에서 흑백을 표현하기 위해서는 Y 성분만 있으면 됩니다. 사람이 물체를 인식하는데 휘도(밝기)에 민감하지 그 외 Color 성분은 별로 민감하지 않습니다. 이것은 눈의 특성을 보면 알 수 있는데요, 사람의 눈에서 휘도를 구분하는 ‘간상세포’는 눈 전체영역에 분포하게 되고, 색을 구분하는 ‘원추세포’는 눈의 중심부에만 분포하여, 사람의 눈은 색상보다는 밝기에 민감하게 됩니다.

이렇게 때문에 사람이 민감하지 않은 모든 색상정보를 전부 포함해야 하는 RGB방식에 비해서, 적응양의 데이터(약 2/1)로도 비슷한 화질을 낼 수 있게 됩니다. (아래 설명 할 서브샘플링을 하였을때..)

영상장치가 영상을 만들 때, 빛을 인식하여(RGB)를 YUV로 바꿔 주게 되며, YUV를 압축하기 위해 서브샘플링을 하여 데이터를 줄이고, 저장장치에 저장하게 됩니다. 계속 알아야 할 개념이 늘어나고 있습니다. 다음은 서브샘플링에 관해 알아보겠습니다.

#3. YbCbCr 서브샘플링

동영상(Image)의 크기를 줄이기 위해 YbCbCr을 그대로 사용하기 보다는 압축하는 것이 효율 적입니다. 앞서 설명처럼 인간은 색차 보다는 밝기에 더 민감하기 때문에 샘플링에서도 이러한 기법을 사용함으로써 데이터를 압축 할 수 있습니다. 쉽게 말해 Y성분을 CbCr보다 많이 할당 함으로써 데이터를 줄이는데 감소한 데이터에 비해서 시각적인 차이는 거의 없게 됩니다.

러한 샘플링 기법은 Y Cb Cr의 각각의 비율에 따라 조금씩 다르게 나누어 집니다. 인코딩에서 사용하는 샘플링 비율은 아래의 3개의 비율을 사용합니다.

  • YCbCr 4:4:4 format

                                                  - 그림3. YCbCr 4:4:4 format -
     각 픽셀당 Y Cb Cr이 각각 4개가 들어가게 됩니다.

 

  • YCbCr 4:2:2 format
                                                       - 그림4. YCbCr 4:2:2 format -
    각 픽셀당 2개의 블럭을 기준으로 Y 4개 CbCr 2개를 공유하여 사용합니다.

  • YCbCr 4:2:0 format (YCbCr 4:1:1)
                                                        - 그림5. YCbCr 4:2:0 format -
    이 방식이 동영상 인코딩시 표준으로 쓰입니다. 그림5를 보면 YCbCr 4:1:1로 표현하는 것이 맞지만 표준화 기구에서 정한 이름이 4:2:0이라고 합니다. 저도 처음에 이름 때문에 좀 개념이 해깔렸습니다. 각 픽셀당 Y 4개 CbCr 1개를 공유하여 사용합니다.

    내용 추가 '09.09.02
    YCbCr (4:2:0) 와 YCbCr (4:1:1) 의 차이는 같이 사용하는 자료들도 있고 다르게 구분하는 자료들도 있는 것 같군요. 그래서 제 생각에는 YCbCr (4:2:0) 와 YCbCr (4:1:1)이 유사하다고 생각하면 댈 것 같습니다.  실제로 많은곳에서  같은 서브샘플링 개념으로 사용되고 있는 것도 사실이니까요.


#4. YCbCr 4:2:0 video format일 경우 데이터 구조는 어떠할까요?

데이터의 Type은 Byte이고 값은 0~255의 값이 들어갑니다. 그리고 중요한 것은 YCbCr의 경우 파일의 정보를 표시하는 ‘헤더’는 존재 하지 않습니다. 그래서 다음과 값은 데이터 구조를 가지게 됩니다.


-그림6. YCbCr 4:2:0의 데이터 구조-

빨간 점선은 프레임의 구분을 의미 합니다. 즉 한 프레임에 해당하는 Y정보가 먼저 나오고, 뒤를 이어 Cb Cr의 정보가 파일에 쓰여 있습니다. 예를 들어  해상도가 10X10이고, 10개 Frame으로 구성된 동영상의 경우 Y 100개, cb 25개, Cr25개의 정보가 쭉 이어 나오고 또 Y 100개, cb 25개, Cr25개의 정보가 쭉 이어 나오는 식으로 총 10개(10 프레임이므로)가 나열 됩니다.

 

생각보다 간단한 구조입니다. 이렇게 생각해 보면 파일에서 100Byte를 읽어오고 50Byte 건너뛰고 또 100Byte를 읽고 50Byte를 건너뛰는 방법으로 파일을 읽어 새롭게 저장하면, 원래 영상에서 흑백영상을 뽑아 올 수도 있습니다.

이번엔 RGB, YCbCr의 색공간에 대해 살펴 보았고, 서브샘플링에 관해서도 살펴 보았습니다. 다음 번에 어떠한 내용부터 올려야 할지 아직 잘 모르겠네요. 일단은 Motion Estimation 기법에 관해 올리려고 생각 중에 있습니다.




-------------------------------------------------------------------------------------------------------------------------------------------

# 마치면서..(좀더 알아볼 점)

  • YCbCr에서 Y는 어떤(? 정확히 모르겠어요) 용어와 해깔리지 않기 위해 Y’라고 표현해야 맞다고 합니다. 즉 Y’CbCr입니다. 대강 설명하자면 아날로그 인코딩과 디지털 인코딩 방식의 차이라고 알고 있습니다.
  • YUV와 YCbCr이 같은 거처럼 글을 썻지만, 사실 비슷하지만 조금 다른 개념인 것 같습니다. 저는 인코딩에 필요한 개념으로 용어에 따른 차이가 있을 수 있겠습니다.

 

참고 사이트 : http://www.fourcc.org/

Posted by 맨날맑음
,

#1. [H.264] 동영상 압축의 기본 개념
#2. [H.264] 동영상 압축의 기본 개념 – RGB, YCbCr, 서브샘플링
#3. [H.264] Block-based Motion Estimation(ME)
#4. [H.264] Discrete Cosine Transform(DCT) 이산 코사인 변환
#5. [H.264] Quantization(양자화)과 Zig-zag scanning

안녕하세요? 맨날맑음 입니다.

#0. 들어가며..

방학을 이용하여, H.264 코덱을 공부하는 것을 목표로 해서 동영상의 인코딩, 디코딩에 관해 배워 나가고 있습니다.

이 내용들은 제가 세미나를 통해 배운 내용을 나름대로 정리하여 잊어 버리지 않게 하는 것이 용도이고, 저도 세미나 도중 이해 가지 않는 부분이 있으므로, 제가 올린 내용이 틀릴 수 있습니다. 내용에 틀린 점이 있을 시 지적해 주시면 즉시 내용을 수정 하도록 하겠습니다.

#1. 동영상이란?

동영상 압축의 기본을 알기 위해선 우선 동영상이 무엇인지 알아야 합니다.

 
-그림1. 동영상의 구조-

위의 그림에서 알 수 있듯이 동영상은 정지된 사진(프레임)이 시간을 축으로 여러 장 모여 있는 것입니다. 즉 주어진 시간 동안 연속으로 촬영된 사진이라 볼 수 있습니다.(사실 여기서 소리도 포함 되야 하지만, 소리는 별도의 인코딩 과정을 거친 후 먹싱 되므로 소리는 빼고 생각해 보겠습니다.)

렇다면 동영상(RGB 비디오)의 데이터 크기는 어떻게 될까요? 프레임은 그림파일(Image)와 같습니다. 예를 들어 512×512의 동영상이 있다고 하면, 이 동영상의 한 프레임을 기준으로 가로 : 512, 세로 : 512개의 점(픽셀)으로 구성되어있으며, 1픽셀은 8bit(256 levels)입니다.  그 중에서 회색이 차지하는 비율만 생각해 보면, Width×Height×Bit(512×512×8)가 됩니다. 그리고 3개의 Color들로 구성 되어있으므로, RGB의 경우 Width×Height×Bit×Color(512×512×8×3)이 되어 6291456bit가 됩니다. 6291456(bit) == 6144(kbit) == 6(mbit) 입니다.

512×512라는 비교적 작은 사이즈의 동영상도 무 압축일 경우, 한 프레임에 6메가라는 큰 사이즈가 되는 것입니다. 동영상서비스를 제공 할 경우 적어도 초당 24프레임을 보장해야 한다고 하니 1초의 동영상에 144메가라는 큰 용량이 필요한 것입니다. 이것이 우리가 동영상 압축을 공부해야 하는 이유이기도 합니다.

네트워크 기술이 많이 발달하였지만, 이런한 무 압축 비디오까지 실시간으로 전송 하는 데는 역부족 입니다. 더군다나 요즘 많이 보급된 FullHD의 경우 1920×1080의 해상도를 지원해야 하기 때문에, 어마어마한 데이터 양이 될 수 밖에 없습니다. 또한 네트워크 대역폭이 이 정보를 전부 전송해 줄 수 있다고 하더라도, 동영상의 크기를 줄여, 그 남는 대역폭을 이용하여 여러 다른 서비스를 제공 해 줄 수도 있을 것입니다.

 

#2. 동영상 압축 기법(동영상 압축을 위한 기본적인 방법)

이러한 동영상을 압축 하려면 어떻게 해야 할까요?

동영상 압축에는 크게 세 가지 기법이 사용 됩니다. 첫번째는 프레임 간의 상관관계 (temproal correlation)이고, 두번째는 공간적인 상관관계(spatial correlation)입니다. 세번째는 저주파 성분에 민감한 시각의 특성을 이용합니다 (DCT 변환).

                        -그림2. 프레임 9-                                                   -그림3. 프레임 10-

먼저 프레임간의 상관관계를 알아보도록 하겠습니다. 그림 2와 3은 각각 같은 동영상(football_sif.yuv)의 9번과 10번 프레임입니다. 마치 같은 그림처럼 닮아있습니다.  근접한 프레임은 거의 비슷한 이미지로 이루어져 있다는 아이디어를 이용하여, 영상의 크기를 줄일 수 있습니다.


-그림 4. Image의 공간적인 중복-

그림 4에서 보는 것과 같이 한 장의 이미지에도 인접한 픽셀간의 정보는 거의 중복 된다는 것을 알 수 있습니다. 이방법으로도 영상의 크기를 줄 일 수 있을 것입니다.

Temporal correlation(프레임간의 상관관계)은  그림 5,6처럼 현재 프레임(t)의 하나의 픽셀(x,y)은 이전 프레임(t-1)의 비슷한 위치(x,y)에 있을 가능성이 높고, 또한 두 필셀 사이에는 유사성이 높다는 것입니다.

                       -그림 5. Frame(t)-                                                -그림 6. Frame(t-1)-

이렇게 프레임(t)에서 프레임(t-1)과의 차를 계산해 보면 중복 데이터가 사라지고, 차이인 그림 7이 나오게 됩니다.


      -그림 7. Frame(t) 와 Frame(t-1)의 Difference - 


이번에 간단한 동영상의 정의와, 동영상을 압축하는 기본적인 방법을 알아 보았습니다. 다음에는 RGB와 YUV를 알아보고, 위에서 간단히 소개한 압축의 기법들을 자세히 소개하는(주파수 도메인(DCT)을 이용한 방법, Motion Estimation 등) 순으로 진행 할 예정이며, 기본적인 지식을 갖춘 후, H.264에 대해서도 알아 보도록 하겠습니다.

Posted by 맨날맑음
,

 안녕하세요? 맨날맑음 입니다.

다른 사용자의 블록를 돌아다닐때 마다 멋진 블로그가 많아 새롭게 블로그를 좀 꾸며 보려고 했는데; 역시 웹지식이 너무 없는 관계로 쉽지 않군요..(특히..CSS)

스킨 변경한다는 핑계로 포스팅을 멈추었는데;; 이제 다시 포스팅을 하고, 스킨은 HTML과 CSS, 스크립트를 좀 공부해가면서 천천히 변경해 보아야겠습니다.

Posted by 맨날맑음
,
i n v i t a t i o n

티스토리 초대장

+ 남은 초대장 수 : 00

안녕하세요!

티스토리에 보금자리를 마련하시려는 여러분께 초대장을 배포해 드리려고 합니다.

나만의, 내 생각을, 내 기억을 담는 소중한 블로그를 만들고 싶다면 티스토리로 시작해보세요!

티스토리 블로그는 초대에 의해서만 가입이 가능합니다. 원하시는 분은 댓글에 E-mail 주소를 남겨주시면 초대장을 보내드립니다. 남겨주실 때에는 꼭 비밀댓글로 남겨주세요!

 선착순으로 초대장 배포합니다^^
티스토리 이래서 좋아요!
1. 이미지, 동영상, 오디오, 파일까지! 무한 용량과 강력한 멀티미디어를 올릴 수 있어요!
2. 스킨위자드로 스킨을 내맘대로~ 거기에 기능 확장 플러그인까지!
3. 내가 원하는대로 myID.com으로 블로그 주소를 만들 수 있어요!
Posted by 맨날맑음
,

안녕하세요? 맨날맑음 입니다.

회원가입 기능을 구현하다 보면, 주민등록번호가 올바른지 체크해야 하는 경우가 생기게 됩니다.
우선 주민등록번호가 어떠한 형태(?)로 이루어 졌는지 알아 볼 필요가 있습니다.

주민등록번호는 총 13자리 숫자로 구성되어 있습니다.
모두 아시는 바와같이 앞의 6자리는 태어난 날의 년, 월, 일을 나타냅니다  
뒤의 7자리는 조금 복잡한데요. 
 # 1번 자리 : 성별 (ex. 남자 : 1또는3, 여자 : 2또는4)
    - 3과 4는 낮설겠지만 00년 이후 출생자부터는 남자는 3 여자는 4입니다.
 # 2~5번 자리 : 출생 신고 당시의 거주지 관할 동사무소의 지역코드
 # 6번 자리 : 출생 신고 날짜
 # 7번 자리 : 검정 코드
    - 7번 자리가 매우 중요합니다. 이것은 앞의 12자리의 유효성을 검증해 줄 매직넘버(?)로 쓰이게 됩니다. 

주민등록번호의 유효성을 알아 보기 위해서는 각 자리수의 미리 지정된 값을 곱하여, 곱한 결과를 전부 더하고,
그 값을 11로 나눈 후, 그 결과 값(나머지)11에서 빼어 13번째 자리수인 검정 코드와 일치하면 유효하게 됩니다.
참.. 말로 할려니 쉽지 않습니다.

주민등록번호가 123456 - 1234567 이라고 예를 들어 보겠습니다.
# 1. 아래와 같이 검정 코드인 7을 제외한 각자리에 미리 지정된 값(234567892345)을 각각 곱하여 줍니다.

# 2. 각 자리에서 곱한 결과를 모두 더해 줍니다.

# 3. 더한 결과(206)을 11로 나누어 줍니다(% 나머지 연산).

# 4. 11에서 나머지의 결과를 빼줍니다.

# 5. 나머지 3과 검증코드 7이 같은지 확인 합니다. 같으면 유효한 주민등록번호입니다. 이 경우 11에서 10을 뺀다던지, 1을 빼면 2자리의 결과가 나오게 됩니다. 그럴때는 뒤의 1자리만 취하여 비교하시면 됩니다. (이와같은 이유로 4번의 결과에 % 연산으로 10을 한번 더해주면 뒤의 1자리만 취할 수 있겠죠?)

# 결론 . 주민등록번호 123456 - 1234567는 틀린 주민번호 입니다!


C# 코드로 만들어 보겠습니다.
코드 작성시 고려 사항
  # 1. 주민등록번호가 13자리 인가?
  # 2. 13자리 모두 숫자인가?
  # 3. 위의 공식에 부합하는가?

bool IsAvailableRRN(string RRN)

{

    //공백 제거

    RRN = RRN.Replace(" ", "");

    //문자 '-' 제거

    RRN = RRN.Replace("-", "");

    //주민등록번호가 13자리인가?

    if (RRN.Length != 13)

    {

        return false;

    }

 

    int sum = 0;

    for (int i = 0; i < RRN.Length - 1; i++)

    {

        char c = RRN[i];

        //숫자로 이루어져 있는가?

        if (!char.IsNumber(c))

        {

            return false;

        }

        else

        {

            if (i < RRN.Length)

            {

                //지정된 숫자로 자리를 나눈 더한다.

                sum += int.Parse(c.ToString()) * ((i % 8) + 2);

            }

        }

    }

    // 검증코드와 결과 값이 같은가?

    if (!((((11 - (sum % 11)) % 10).ToString()) == ((RRN[RRN.Length - 1]).ToString())))

    {

        return false;

    }

    return true;

}

Posted by 맨날맑음
,