BT.601과 BT.709 변환 행렬

RGB에서 YCbCr로, 그리고 그 역으로 변환할 때 사용되는 변환 행렬은 색 공간 표준에 따라 달라집니다. 가장 일반적인 두 가지 표준은 BT.601과 BT.709이며, 이들은 각각 SDTV (Standard Definition Television)와 HDTV (High Definition Television)에 사용됩니다. 각 표준은 색상 표현 방식에 약간의 차이가 있으며, 이에 따라 변환 공식도 달라집니다.

1. BT.601 (Rec. 601):

  • 용도: SDTV (Standard Definition Television) 시스템에 사용됩니다.
  • 주요 특징: SDTV의 색 공간 특성을 반영하며, 오래된 표준이지만 JPEG 압축 등 다양한 분야에서 여전히 널리 사용됩니다.
  • 변환 공식 (RGB -> YCbCr):
    • Y (휘도): RGB 값의 가중 평균으로 계산됩니다. 녹색(G)이 휘도에 가장 큰 영향을 미칩니다.
    • Cb (청색 색차): 청색 성분과 휘도의 차이를 나타냅니다.
    • Cr (적색 색차): 적색 성분과 휘도의 차이를 나타냅니다.
    • 128 오프셋: Cb와 Cr은 부호 있는 값을 가지므로, 0~255 범위에 맞추기 위해 128을 더합니다.
  • Y  = 0.299R + 0.587G + 0.114B
    Cb = 128 - 0.168736R - 0.331264G + 0.5B
    Cr = 128 + 0.5R - 0.418688G - 0.081312B
    Use code with caution.
  • 역변환 공식 (YCbCr -> RGB):
  • R = Y + 1.402 * (Cr - 128)
    G = Y - 0.344136 * (Cb - 128) - 0.714136 * (Cr - 128)
    B = Y + 1.772 * (Cb - 128)
    Use code with caution.

2. BT.709 (Rec. 709):

  • 용도: HDTV (High Definition Television) 시스템에 사용됩니다.
  • 주요 특징: HDTV의 넓은 색 영역을 지원하며, BT.601보다 현대적인 표준입니다.
  • 변환 공식 (RGB -> YCbCr):
    • BT.601과 비교했을 때, 각 RGB 값에 대한 가중치가 다릅니다. 특히 녹색(G)의 가중치가 더 높아졌고, 청색(B)의 가중치가 더 낮아졌습니다. 이는 HDTV의 색 공간 특성을 반영합니다.
  • Y  = 0.2126R + 0.7152G + 0.0722B
    Cb = 128 - 0.114572R - 0.385428G + 0.5B
    Cr = 128 + 0.5R - 0.454153G - 0.045847B
    Use code with caution.
  • 역변환 공식 (YCbCr -> RGB):
  • R = Y + 1.5748 * (Cr - 128)
    G = Y - 0.1873 * (Cb - 128) - 0.4681 * (Cr - 128)
    B = Y + 1.8556 * (Cb - 128)
    Use code with caution.

코드 수정 방법:

만약 BT.601 대신 BT.709를 사용하려면 JavaScript 코드에서 다음과 같이 변환 공식을 수정해야 합니다.

// BT.709를 사용하는 RGB에서 YCbCr로의 변환
function rgbToYCbCr_BT709(r, g, b) {
  const y = 0.2126 * r + 0.7152 * g + 0.0722 * b;
  const cb = 128 - 0.114572 * r - 0.385428 * g + 0.5 * b;
  const cr = 128 + 0.5 * r - 0.454153 * g - 0.045847 * b;

  const clamp = (value) => Math.max(0, Math.min(255, value));

  return {
    y: clamp(y),
    cb: clamp(cb),
    cr: clamp(cr),
  };
}

// BT.709를 사용하는 YCbCr에서 RGB로의 변환
function yCbCrToRgb_BT709(y, cb, cr) {
  const r = y + 1.5748 * (cr - 128);
  const g = y - 0.1873 * (cb - 128) - 0.4681 * (cr - 128);
  const b = y + 1.8556 * (cb - 128);

  const clamp = (value) => Math.max(0, Math.min(255, value));

  return {
    r: clamp(r),
    g: clamp(g),
    b: clamp(b),
  };
}
Use code with caution.JavaScript

선택 기준:

어떤 표준을 선택해야 할지는 사용 사례에 따라 달라집니다.

  • JPEG 압축: JPEG은 주로 BT.601을 사용합니다. 따라서 JPEG 압축/해제와 관련된 작업을 수행하는 경우 BT.601을 사용하는 것이 좋습니다.
  • HD 비디오 처리: HDTV 콘텐츠를 처리하는 경우 BT.709를 사용하는 것이 더 정확한 색상 표현을 제공합니다.
  • 일반적인 이미지 처리: 특별한 요구 사항이 없다면 BT.709를 사용하는 것이 더 나은 선택일 수 있습니다.

결론:

BT.601과 BT.709는 각각 SDTV와 HDTV에 사용되는 색 공간 표준이며, 변환 행렬에 차이가 있습니다. 어떤 표준을 선택할지는 사용 사례에 따라 다르며, 해당 표준에 맞는 변환 공식을 사용해야 정확한 색상 표현을 얻을 수 있습니다.