RGB 영상에서의 픽셀 데이터 구성에 대해 알아봅니다.
1. DICOM RGB 영상.
DICOM Tag PhotometricInterpretation(0028,0004)이 RGB인 영상입니다.
RGB 영상은 각 픽셀의 색상을 빨간색, 녹색, 파란색의 세 가지 채널로 이루어져 있으며 세 채널의 조합으로 모든 색상을 표현할 수 있습니다.
2. Planar Configuration
RGB 영상의 픽셀데이터 구성에 대해 알기 위해선 먼저 PlanarConfiguration(0028,0006) 태그를 먼저 확인해야 합니다.
이 태그는 DICOM 이미지에서 색상 채널 데이터가 어떻게 배열되는지를 정의하는 DICOM 태그입니다. 해당 값은 0 혹인 1로 표시되며 각각 다음을 의미합니다.
0인 경우 RGB 채널이 인터리브(Interleaved)하게 이루어져 있습니다. Color-by-pixel 방식이라고도 하며 모든 채널의 데이터를 교대로 저장하여 RGB 데이터가 연속된 형식으로 존재합니다. 이는 각 픽셀에 해당하는 RGB값이 연속적으로 저장됨을 뜻합니다. 예: [R0, G0, B0, R1, G1, B1, ...]
1인경우 RGB 채널이 플래너(Planar)하게 이루어져 있습니다. Color-by-plane 방식이라고도 합니다. 각 색상 채널이 별도의 2D 이미지로 저장되며, 각 채널이 독립적으로 배열됩니다. 이는 각 색상 채널이 개별적으로 저장되어 있음을 뜻합니다. 예: 예: [R0, R1, R2, ..., Gn, Gm, Gn+1, ..., Bn, Bm, Bn+1, ...]
3. BitAllocated와 BitStored
DICOM에서 픽셀 데이터를 다루기 위해선 또 다른 태그를 더 살펴봐야 합니다.
Bit Allocated(0028,0100)는 각 픽셀에 할당된 총 비트 수를 의미하며 일반적으로 8, 12, 16 비트가 사용됩니다. Bits Stored(0028,0101)는 각 픽셀에 저장된 실제 유효 비트 수를 의미합니다.
예를 들어, Bits Allocated가 16이고, Bits Stored가 12이면, 각 픽셀 데이터는 16비트로 저장되지만, 그중 12비트만 유효 데이터로 사용됩니다. 나머지 4비트는 일반적으로 0으로 채워짐을 의미합니다.
4. 픽셀 데이터 계산
이제 기본적인 태그(rows 및 colums)를 사용해 RGB 영상의 픽셀 데이터 위치를 알아낼 수 있습니다.
PlanarConfiguration이 1일 때 rows(H)와 columns(W)가 512인 경우 x, y좌표 300, 250의 RGB값은 다음과 같이 구할 수 있습니다.
⇒ 한 프레임의 픽셀 수: W x H
⇒ 한 프레임의 채널 데이터 크기: W x H
⇒ 한 프레임의 전체 데이터 크기: 3 x W x H
여기서 각 프레임의 데이터는 연속적으로 저장되므로, N번째 프레임의 시작 위치는 다음과 같이 계산할 수 있습니다
⇒ N번째 프레임의 시작 위치: (N-1) * 3 * W * H
PlanarConfiguration이 1이므로 각채널의 시작위치는 다음과 같이 유추할 수 있습니다.
⇒ Red 채널의 시작 위치: (N-1) * 3 * W * H
⇒ Green 채널의 시작 위치: (N-1) * 3 * W * H + W * H
⇒ Blue 채널의 시작 위치: (N-1) * 3 * W * H + 2 * W * H
마지막으로 실제 우리가 원하는 픽셀의 인덱스 위치는 다음과 같이 계산할 수 있습니다.
⇒ 픽셀 인덱스: y * W + x
따라서 위의 모든 식을 종합하면 PlanarConfiguration이 1일 때 rows(H)와 columns(W)가 512인 경우 x, y좌표 300, 250의 RGB의 위치는 다음과 같이 산출됩니다.
⇒ Red 값의 위치: (N-1) * ( 3 x W x H)+ (y * W + x)
⇒ Green 값의 위치: (N-1) * ( 3 x W x H) + (W * H)+ (y * W + x)
⇒ Blue 값의 위치: (N-1) * ( 3 x W x H) + (2 * W * H) + (y * W + x)
다음으로 PlanarConfiguration이 0일 때 rows(H)와 columns(W)가 512인 경우 x, y좌표 300, 250의 RGB값은 다음과 같이 구할 수 있습니다.
⇒ 한 프레임의 픽셀 수: W x H
⇒ 한 프레임의 전체 데이터 크기: 3 x W x H
여기서 각 프레임의 데이터는 연속적으로 저장되므로, N번째 프레임의 시작 위치는 다음과 같이 계산할 수 있습니다
⇒ N번째 프레임의 시작 위치: (N-1) * 3 * W * H
다음으로 우리가 원하는 픽셀의 인덱스 위치는 다음과 같이 계산할 수 있습니다.
⇒ 픽셀 인덱스: y * W + x
PlanarConfiguration이 0이므로, 각 픽셀의 R, G, B 값이 연속적으로 저장됩니다. 따라서, N번째 프레임의 시작 위치에서 해당 픽셀 인덱스를 3배 한 값이 각 채널의 시작 위치가 됩니다.
⇒ Red 값의 위치: (N-1) * (3 * W * H) + 3 * (y * W + x)
⇒ Green 값의 위치: (N-1) * (3 * W * H) + 3 * (y * W + x) + 1
⇒ Blue 값의 위치: (N-1) * (3 * W * H) + 3 * (y * W + x) + 2
이제 해당 값을 이용해 픽셀 데이터를 원하는 값으로 수정할 수 있습니다.
'Trunk > DICOM' 카테고리의 다른 글
[DICOM] PDU와 PDV (1) | 2023.12.08 |
---|---|
[DICOM] DICOM Tag Type과 그 종류 (0) | 2023.03.21 |
[DICOM] DICOM Tag 값의 길이에 대해 (0) | 2023.03.08 |
[DICOM] MWL: Modality Worklist (0) | 2023.02.18 |
[C#|Fo-DICOM] TransferSyntaxUid를 입력받아 파일의 TransferSynx와 비교하기. (0) | 2022.05.03 |