본문 바로가기
온라인 멘토와 함께하는 공부/OpenCV로 배우는 영상처리

디지털 영상의 구조

by easyfly 2022. 3. 24.
반응형

디지털 영상의 구조

디지털 영상 처리에서 많이 사용되는 영상 파일 포맷들은 아래와 같다.

RAW 영상

영상 구성에 대한 헤더 정보를 포함하지 않고 영상의 픽셀값만을 가지고 있는 파일이다. 따라서 영상을 처리하기 위해서는 사전에 영상의 가로 및 세로의 크기를 알고 있어야 한다. 무손실 저장 방식이며 확장자는 '.raw'이다.

BMP(bitmap 영상)

MS에서 윈도즈 기반 운영체제에서 사용할 목적으로 만든 무손실 영상 저장 방식이다. 이 방식은 영상의 픽셀값을 그대로 저장하는 방식이다. 이 방식은 영상의 픽셀값을 그대로 저장하는 방식이다. 이 방식은 헤더(header), 팔레트(palette), 픽셀값으로 구성된다.

JPEG(Joint Photographic Cxperts Group)

JPEG 영상 저장 방식은 정지 영상을 위해서 만들어진 손실 압축 방법 표준이다. 압축률에 따라 영상의 파일 크기를 줄일 수 있지만 그만큼 영상 화질의 손상이 있다. JPEG를 사용하는 파일 형식들은 보통 JPEG 영상이라 불리며 '.jpg', '.jpeg' 등의 확장자를 사용한다.

PNG(Portable network Graphics)

소셜 미디어나 고화질 그래픽이 필요한 사진 포트폴리오 등에서 많이 사용하는 파일 형식이다. 가장 큰 장점은 다양한 색과 투명 백그라운드를 지원한다는 것이다. BMP와 같이 무손실 압축 방식을 사용하므로 영상의 세부 손실이 전혀 없고 JPEG보다 고품질의 영상을 저장할 수 있다. 무손실 압축이므로 영상이 선명한 장점은 있지만, 파일 크기가 커지는 단점이 있다.

BMP 영상 저장 방식

비트맵 방식은 마이크로소프트 윈도즈에서 사용할 목적으로 만들어진 디지털 영상 저장 포맷이다. 기본적으로 1~24 비트의 색을 표현할 수 있지만 알파 채널을 포함한 32비트 포맷이 사용되기도 한다.

BMP는 장치 의존 비트맵(DDB: Device Dependent Bitmap)과 장치 독립 비트맵) DIB: Device Independent Bitmap)으로 나뉜다. DDB는 모니터에 나타나는 영상이 모니터 화면에 설정된 값에 의해 출력되는 방식이다. DIB는 출력 장치의 설정이 달라지더라도 자신의 비트맵 값이 그대로 출력되도록 하는 방식으로 대부분의 BMP 파일은 DIB 방식으로 저장되어 있다.

일반적으로 쓰이는 BMP는 다음 데이터 블록을 담고 있다. BMP를 비롯하여 PNG와 같은 무손실 압축 파일 형식은 대부분 BMP와 유사한 파일 헤더를 가지고 있다.

  • BMP 헤더: 파일에 대한 일반 정보를 담고 있다.
  • 비트맵 정보(DIB 헤더): 비트맵 그림에 대한 자세한 정보를 담고 있다.
  • 색 팔레트: 인덱스 컬러 비트맵에 쓰이는 색의 정의를 담고 있다.
  • 비트맵 데이터: 픽셀 단위의 실제 그림을 담고 있다.

예를 들어 BMP 영상의 크기가 100 × 100 24비트 트루 컬러라면

파일 헤더 14바이트, 비트맵 정보 40바이트, 영상 (가로 100 × 세로 100 × 3)
14+40+(100 × 100 × 3) = 30,054바이트

BMP 헤더

BITMAPFILEHEADER 구조체로 표현된다.

typedef struct tagBITMAPFILEHEADER{
WORD bfType; // "BM"이라는 글자가 설정됨
DWORD bfSize; // 비트맵 파일의 전체 크기
WORD bfReserved1; // 예약변수(0으로 설정)
WORD bfReserved2; // 예약변수(0으로 설정)
DWORD bfOffBits; // 파일에서 비트맵 데이터가 있는 위치
} BITMAPFILEHEADER

총 14 바이트 = 2 + 4 + 2 + 2 + 4

비트맵 정보

BITMAPINFOHEADER 구조체로 표현되며, 가로와 세로의 크기, 색상 수 등의 비트맵 자체의 정보를 담고 있다.

typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 이 구조체를 저장하기 위해 필요한 바이트 수
LONG biWidth; // 비트맵 가로 크기
LONG biHeight; //비트맵 세로 크기
WORD biPlanes; // 비트맵을 화면에 보여줄 때 필요한 Plane수
WORD biBitCount; // 한 픽셀 당 비트수
DWORD biCompression; // 압축 유무 플래그
DWORD biSizeImage; // 영상 데이터의 크기를 바이트 단위로 표시
LONG biXPelsPerMeter; // 미터 당 가로 픽셀 수
LONG biYPelsPerMeter; // 미터 당 세로 픽셀 수
DWORD biClrUsed; // 그림에서 실제 사용되는 컬러 수
DWORD biCirImportant; // 중요하게 사용되는 컬러
} BITMAPINFOHEADER

총 40 바이트 = 4 + 4 + 4 + 2 + 2 + 4 + 4 + 4 + 4 + 4 + 4

JPEG 영상 저장 방식

JPEG 저장 방식은 총 4개의 과정을 거쳐 압축이 이뤄진다.

첫 번째 단계로 픽셀의 RGB 성분을 YCrCb 성분으로 변화시키다. 사람은 색상 변화보다 밝기 변화에 더 민감하기 때문에 색상 변환 후에 각 색상별로 압축률을 다르게 적용한다. 따라서 휘도 채널인 Y 채널은 그대로 두고 Cr과 Cb 채널은 압축률에 따라 선택되는 픽셀의 개수를 줄인다. 이러한 과정을 크로마서브샘플링이라고 한다.

두 번째로 DCT(Discrete Cosine Transform, 이산코사인변환)변환과 양자화를 적용한다. 손실되면 크게 영향을 미치는 저주파 성분은 유지하고 고주파 성분을 줄이는 방식을 DCT라고 한다. 영상을 각각 8×8 블록으로 자르고 각각의 블록에 DCT 변환을 수행하면 공간 영역에서 주파수 영역으로 변하면서 좌측 상단에는 저주파 성분이 배치되고 우측 하단에는 고주파 성분이 배치된다. DCT 변환된 행렬에서 최상위(0, 0) 위치의 계수를 DC라 부르고, 나머지 계수들을 AC라고 부른다.

세 번째 단계로 Zig-Zag스캐닝 방법을 이용하여 DCT 행렬의 값들을 백테에 저장한다. 이렇게 하면 실제 값을 갖는 부분은 벡터의 앞부분에 들어가고 0인 값들은 연속적으로 뒷부분에 입력됨으로 0이 들어간 부분 전체를 제거할 수 있게 된다.

네 번째 단계로 양자화된 DC계수는 허프만 인코딩(Huffman encoding) 방식을 이용하여 부호화되고, AC계수는 Run-length 부호화와 허프만 인코딩을 이용해 부호화된다.

반응형