[OpenCV] 영상 파일 형식, 그리고 BMP

zzwon1212·2023년 10월 22일
0

OpenCV

목록 보기
2/16
post-thumbnail

1. 파일 형식

1.1. BMP

  • 픽셀 데이터를 압축하지 않고 그대로 저장하기 때문에 파일 용량이 큼
  • 파일 구조가 단순하여 별도의 라이브러리 없이 파일 입출력 프로그래밍 가능

1.2. JPG

  • 주로 사진 같은 컬러 영상을 저장
  • 손실 압축(lossy compression)
  • 압축률이 좋아서 파일 용량이 크게 감소하기 때문에 디지털 카메라 사진 포맷으로 주로 사용

1.3. GIF

  • 256 색상 이하의 영상을 저장하기 때문에 일반 사진을 저장할 시 화질 열화가 심함
  • 무손실 압축(lossless compression)
  • 움직이는 GIF 지원

1.4. PNG

  • Portable Network Graphics
  • 무손실 압축(컬러 영상도 무손실 압축)
  • 알파 채널을 지원

1.5. 정리

① 파일 크기를 고려하지 않을 경우: BMP
② 파일 크기를 고려해야 하는 경우: PNG, TIF
③ 파일 크기를 고려해야 하며, 픽셀 값이 조금 변해도 괜찮은 경우: JPG

2. 비트맵(bitmap)

2.1. 개요

  • 비트들의 집합 → 픽셀의 집합

  • 영상의 전체 크기에 해당하는 픽셀 정보를 그대로 저장

    • 장점: 표현이 직관적이고 분석이 용이함
    • 단점: 메모리 용량을 많이 차지함, 영상의 확대/축소 시 화질 손상이 심함
  • 용도: 사진, 포토샵

  • 종류

    • 장치 의존 비트맵(DDB):
      • 출력 장치(화면, 프린터 등)의 설정에 따라 다르게 표현됨
    • 장치 독립 비트맵(DIB)
      • 출력 장치가 달라지더라도 항상 동일하게 출력됨
      • BMP 파일은 Windows 환경에서 비트맵을 DIB의 형태로 저장한 파일 포맷

2.2. BMP 파일 구조

  • 비트맵 파일 헤더: 비트맵 파일에 대한 정보

    typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;     // 16진수: 0x42(B), 0x4D(M)
        DWORD   bfSize;     // BMP 파일 크기
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;  // 비트맵 비트까지의 오프셋
    } tagBITMAPFILEHEADER;
    • 14byte 자료형(WORD: 2byte, DWORD: 4byte)
    • bfType: 이 파일이 BMP 파일인지 아닌지 나타내는 2byte 크기의 지시자
    • bfOffBits: BMP 파일 헤더로부터 픽셀 데이터가 있는 위치까지의 거리
  • 비트맵 정보 헤더: 비트맵 영상에 대한 정보

    // 비트맵 정보 헤더
    typedef struct tagBITMAPINFOHEADER {
        DWORD   biSize;         // BITMAPINFOHEADER 크기
        LONG    biWidth;        // 비트맵 가로 크기, 4byte
        LONG    biHeight;       // 비트맵 세로 크기
        WORD    biPlanes;       // 항상 1
        WORD    biBitCount;     // 픽셀당 비트 수
        DWORD   biCompression;  // BI_RGB
        DWORD   biSizeImage;
        LONG    biXPelsPerMeter;
        LONG    biYPelsPerMeter;
        DWORD   biClrUsed;
        DWORD   biClrImportant;
    } BITMAPINFOHEADER;
    • biBitCount: 한 픽셀의 컬러를 표현하기 위해서 사용되는 비트 수. 트루컬러 영상은 24, 그레이스케일은 8
  • 색상 테이블/팔레트

    typedef struct tagRGBQUAD {
        BYTE    rgbBlue;
        BYTE    rgbGreen;
        BYTE    rgbRed;
        BYTE    rgbReserved;
    } RGBQUAD;
    • 4byte
    • 그레이스케일 비트맵
      • (0, 0, 0, 0), (1, 1, 1, 0), (2, 2, 2, 0), ..., (255, 255, 255, 0)
      • 전체 4*256=1024bytes
    • 트루컬러 비트맵은 색상 테이블이 존재하지 않음
  • 픽셀 데이터

    • 그레이스케일 비트맵: RGQUAD 배열의 인덱스 저장
    • 트루컬러 비트맵: (B, G, R) 순서로 픽셀 값 저장
    • 일반적으로 상하가 뒤집힌 상태로 저장됨(bottom-up)
    • 효율적 데이터 관리를 위해 영상의 가로 크기를 4의 배수로 저장

📙강의 - 강사 황선규

profile
JUST DO IT.

0개의 댓글