4.13. 픽셀 포맷

ISP 파이프라인의 마지막 단계는 각 픽셀을 메모리에 특정한 바이트 레이아웃으로 패킹합니다. 선택한 포맷은 이미지 품질, 메모리 크기, 그리고 다운스트림 코드가 바이트를 다시 읽어내는 방식 사이의 절충을 결정합니다. 몇 가지 포맷이 주로 사용됩니다.

4.13.1. RAW (Bayer)

기본 출력은 raw Bayer입니다 – 센서가 생성하는 픽셀당 단일 채널 모자이크 그대로입니다. 픽셀당 1바이트로, Bayer 패턴으로 배치됩니다: 짝수 행에서는 적색과 녹색이 번갈아 나타나고, 홀수 행에서는 녹색과 청색이 번갈아 나타납니다. 디베이어가 적용되지 않았으므로 각 셀은 여전히 자신의 컬러 필터가 통과시킨 값만을 담고 있습니다.

Raw Bayer는 완성된 3채널 RGB 이미지의 3분의 1 메모리만 차지하며 – 픽셀당 3바이트가 아닌 1바이트 – 디베이어나 변환에 ISP 사이클이 소비되지 않습니다. 그 대가로 색상 인식 처리를 실행하기 전에 사용자 코드가 직접 디베이어를 수행해야 합니다.

4.13.2. RGB888

RGB888은 컬러 이미지에 자연스러운 완성 포맷입니다: 픽셀당 3바이트로, 적색, 녹색, 청색 채널에 각각 채널당 8비트씩입니다. 픽셀당 24비트이며 약 1700만 가지의 서로 다른 색상을 표현합니다.

RGB888은 완성된 컬러 이미지의 개념적 기준이며 대부분의 외부 소프트웨어가 이 포맷을 사용합니다. 임베디드 하드웨어에서 주된 단점은 24비트 픽셀 크기입니다 – 프로세서의 워드 크기의 배수가 아니어서 메모리 정렬에 불편하고, 그 다음 작은 포맷보다 50% 더 큽니다.

4.13.3. RGB565

RGB565는 각 픽셀을 2바이트로 패킹합니다: 적색 5비트, 녹색 6비트, 청색 5비트입니다. 추가된 녹색 비트는 녹색에 대한 눈의 더 높은 민감도를 반영하며, Bayer 패턴에서 녹색 채널의 두 배 가중치와도 일치합니다.

RGB565는 OpenMV Cam의 기본 색상 포맷입니다. 픽셀당 2바이트는 16비트 정렬되어 MCU의 자연스러운 데이터 폭에 맞습니다 – 픽셀 로드, 저장, 산술 연산이 모두 최대 속도로 실행되며, 많은 연산이 한 번에 한 쌍의 픽셀을 처리할 수 있습니다. RGB888의 24비트 픽셀은 그렇게 정렬되지 않아 매 접근마다 비용을 치릅니다. RGB888 대비 33퍼센트의 메모리 절감도 누적됩니다: QVGA(320 x 240)는 RGB565에서 150 KB인 반면 RGB888에서는 225 KB이며, 그 차이는 해상도가 높아질수록 커집니다.

그 절충은 1700만 가지가 아닌 6만 5천 가지의 서로 다른 색상입니다. 대부분의 머신 비전 작업에서는 그 차이가 보이지 않는데, 알고리즘이 어차피 대부분의 색상 디테일을 버리는 임계값 처리되거나 에지가 검출된 표현으로 프레임을 축소하기 때문입니다. 사람이 보기에는 누락된 비트가 부드러운 색상 그라데이션에서 희미한 띠로 나타나지만, 눈이 즉시 인지할 만한 것은 아닙니다.

4.13.4. YUV422

YUV422는 각 픽셀의 색상을 휘도 값(Y)과 두 개의 색차 값(U와 V)으로 분리한 다음, 인간의 시각이 밝기 변화보다 색상 변화에 훨씬 덜 민감하기 때문에 색차를 서브샘플링합니다. 각 픽셀은 자체 Y를 가지지만, 인접한 픽셀 쌍은 하나의 U와 하나의 V를 공유합니다. 각 쌍의 바이트 레이아웃은 4바이트 – Y0, U, Y1, V – 로, 평균적으로 픽셀당 2바이트가 되어 RGB565와 동일합니다.

다만 그 2바이트는 RGB565의 것과는 다른 의미를 갖습니다. Y 채널만으로도 바로 사용할 수 있는 8비트 그레이스케일 이미지가 되며, 이는 대부분의 고전적인 머신 비전 알고리즘(에지 검출, 템플릿 매칭, 블롭 분석)이 실제로 소비하는 것입니다. U와 V 채널은 색상 정보를 필요로 하는 소수의 알고리즘을 위한 색상 정보를 담고 있습니다.

YUV422는 파이프라인이 둘 다 필요로 할 때 – Y만 읽는 초기 단계 알고리즘에 이어 더 정밀한 색상 판단을 위해 색차를 사용하는 후기 단계가 따를 때 – 올바른 선택인데, Y 값이 색공간 변환 없이 바로 사용할 수 있도록 거기에 그대로 놓여 있기 때문입니다.

4.13.5. Grayscale

그레이스케일은 픽셀당 1바이트입니다: 휘도 값만 있고 색상은 전혀 없습니다. 가장 작은 완성 포맷으로 – RGB565와 YUV422의 절반 크기, RGB888의 3분의 1 크기입니다.

대부분의 고전적인 머신 비전 알고리즘은 어차피 그레이스케일에서 작동하므로, 색상 채널을 센서에서 바로 떨어뜨리는 것이 흔히 가장 단순하고 메모리 효율적인 선택입니다. 에지 검출, 선 찾기, 블롭 분석, QR 코드 디코딩, 템플릿 매칭, AprilTag 검출은 모두 그레이스케일에서 실행되며 더 작은 버퍼로 이득을 봅니다.

4.13.6. 기타 포맷

OpenMV Cam이 생성할 수 있는 몇 가지 포맷은 일반적인 흐름의 일부로 ISP 파이프라인에서 나오지 않습니다.

BINARY 는 픽셀당 1비트로 – 가능한 가장 작은 표현입니다. 임계값 처리된 이미지, 마스크 버퍼, 그리고 각 픽셀에서 매칭과 비매칭만을 구분하는 모든 연산의 출력에 사용됩니다.

JPEG 는 압축된 색상 포맷입니다. 일부 센서는 온칩 JPEG 인코더를 포함하고 있어 JPEG로 압축된 프레임을 직접 전달할 수 있습니다. 그것이 없는 센서의 경우, MCU가 ISP 이후 완성된 RGB 또는 그레이스케일 프레임에 대해 JPEG 인코더를 실행합니다. 어느 쪽이든 출력은 JPEG 비트스트림이며, 프레임을 스토리지에 저장하거나 대역폭이 제한된 링크를 통해 전송하는 데 유용합니다.

PNG 는 무손실 압축 포맷입니다. 센서는 PNG를 직접 생성하지 않습니다. MCU가 요청 시 완성된 RGB 또는 그레이스케일 프레임을 압축합니다. 대역폭이나 스토리지가 중요하지만 JPEG가 적용하는 손실 압축이 애플리케이션이 나중에 필요로 하는 정보를 버리게 될 때 유용합니다.