DICOM 태그는 의료 영상 파일 안에서 특정 정보를 지정하고 해석하기 위한 표준화된 식별자다.
그러나 태그 하나만으로 모든 정보를 담을 수는 없으며, 태그와 함께 VR(Value Representation), Length, Value라는 세 가지 필드가 결합되어 하나의 "데이터 요소(Data Element)"를 구성한다. 이 네 가지 요소는 의료 영상의 주소·형식·길이·실제 값을 완벽히 정의하며, 단 하나라도 잘못 저장되면 파일 전체를 읽을 수 없는 오류가 발생할 수 있다.
이번 글에서는 각 요소의 역할과 저장 방식, 그리고 실제 DICOM 파일 내에서 어떻게 배치되는지까지 단계별로 분석한다.
1. Tag – 데이터의 주소와 의미
- 형식: 4바이트(16진수 8자리), 두 개의 2바이트 값으로 구성
- 구조: (Group Number, Element Number)
- 예시: (0010,0010) → 환자 이름(Patient’s Name)
- 특징:
- Group 번호가 정보의 대분류 결정
예: 0010 = 환자(Patient), 0008 = 연구/검사(Study/Series) - Element 번호가 세부 항목 결정
- 표준 태그는 DICOM PS3.6 표준 문서에 정의
- Group 번호가 정보의 대분류 결정
- 주의: Private Tag(gggg,eeee에서 gggg 홀수)는 표준이 아닌 장비사 전용 태그
2. VR (Value Representation) – 데이터 형식 정의자
- 형식: 2바이트 영문 코드
- 역할: 값(Value)이 어떤 데이터 타입인지 지정
- 예시:
- PN (Person Name) → 환자 이름
- DA (Date) → 날짜, 형식 YYYYMMDD
- US (Unsigned Short) → 부호 없는 2바이트 정수
- 특징:
- VR에 따라 Length 처리 방식이 다름
- Explicit VR: VR이 명시됨
- Implicit VR: VR 생략, Length 바로 표기
- VR에 따라 Length 처리 방식이 다름
- 주의: VR이 잘못 지정되면 값 파싱 불가
3. Length – 값의 길이(Byte 단위)
- 형식: 2바이트 또는 4바이트 정수
- 역할: Value의 크기를 바이트 단위로 지정
- 예시:
- "John" (4글자) → Length = 4
- 날짜 "20230801" → Length = 8
- 특징:
- Even-length 규칙: 홀수 길이 데이터는 마지막에 공백 또는 NULL 추가
- VR 타입에 따라 Length 필드 크기 차이 있음 (예: OB, OW, SQ 등은 4바이트)
- 주의: Length 불일치 → 다음 태그 위치 오류 발생
4. Value – 실제 데이터 값
- 형식: Length에서 지정한 바이트 수만큼 저장
- 예시:
- (0010,0010) PN 8 "Hong^Gildong"
- (0008,0020) DA 8 "20230801"
- 특징:
- 텍스트, 숫자, 바이너리 이미지 데이터까지 모두 Value에 저장 가능
- Pixel Data(7FE0,0010)는 수 MB~GB의 영상 데이터 저장
- 실무 주의:
- 민감 정보(이름, 주민번호)는 Value 필드에 직접 포함 → 익명화 필요
- 압축 Pixel Data는 별도 Transfer Syntax로 해석
5. Data Element 구조 예시
DICOM의 데이터 요소(Data Element)는 Tag, VR, Length, Value 순서로 저장된다. 이를 hex 편집기로 열어보면 다음과 같은 형태를 확인할 수 있다.
예시 1 – (0010,0010) = Patient’s Name
Hex 데이터:
10 00 10 00 50 4E 08 00 48 6F 6E 67 5E 47 44
① Tag (0010,0010)
- 바이트 순서: 10 00(Group) + 10 00(Element)
- Endian: Little Endian → 실제 값은 0x0010, 0x0010
- 의미: Group 0010(환자 정보), Element 0010(환자 이름, Patient’s Name)
② VR (PN)
- 바이트: 50 4E
- ASCII 변환: P(0x50), N(0x4E)
- 의미: VR = PN (Person Name) → 사람 이름을 나타내는 형식
③ Length (08 00)
- 바이트 순서: 08 00
- Endian: Little Endian → 0x0008 = 8
- 의미: Value 필드의 길이는 8바이트
④ Value ("Hong^GD")
- 바이트: 48 6F 6E 67 5E 47 44 20
- ASCII 변환: H(0x48) o(0x6F) n(0x6E) g(0x67) ^(0x5E) G(0x47) D(0x44) (0x20)
- 의미: 실제 데이터 값은 "Hong^GD "
- DICOM PN 형식에서 ^는 성과 이름을 구분
- 마지막 공백(0x20)은 Even-length 규칙에 따라 패딩된 문자
구성 요소 | Hex 값 | 해석 결과 | 설명 |
Tag | 10 00 10 00 | (0010,0010) | 환자 이름 |
VR | 50 4E | PN | Person Name |
Length | 08 00 | 8 | 값의 길이 |
Value | 48 6F 6E 67 5E 47 44 20 | "Hong^GD " | 환자 이름 (Even-length로 공백 패딩) |
예시 2 – (0008,0020) = Study Date
Hex 데이터:
08 00 20 00 44 41 08 00 32 30 32 33 30 38 30 31
해석
- Tag: 08 00 20 00 → (0008,0020)
- Group 0008(일반 Study/Series/Instance 정보)
- Element 0020(Study Date)
- VR: 44 41 → DA (Date)
- Length: 08 00 → 8바이트
- Value: 32 30 32 33 30 38 30 31 → "20230801"
- 형식: YYYYMMDD → 2023년 08월 01일
6. 네 가지 요소의 상관관계
- Tag: “이 데이터가 무엇인지, 어디 있는지”
- VR: “어떤 형식으로 저장되었는지”
- Length: “얼마나 긴 데이터인지”
- Value: “실제 값은 무엇인지”
이 네 가지 요소들이 맞물려야 DICOM 뷰어는 해당 정보를 정확히 읽을 수 있다. 하나라도 틀리면 파일 해석이 중단되거나 잘못된 데이터가 표시된다.
결론
DICOM 태그는 단독으로 존재하지 않고, VR·Length·Value와 함께 하나의 Data Element를 이룬다.
이 구조를 이해하면 단순 뷰어 사용을 넘어, 태그를 수동 편집하거나 파이썬(pydicom)으로 수정하는 작업까지 가능해진다.
다음 편에서는 태그 번호 해석법과 Group/Element 구조, Endian 방식을 실제 예제와 함께 설명한다.
'개발 > DICOM 태그 구조 마스터하기' 카테고리의 다른 글
4. Endian 규칙과 바이트 순서 해석 – Little vs Big Endian (3) | 2025.08.13 |
---|---|
3. DICOM Tag 번호 해석법 – Group/Element 구조 이해하기 (2) | 2025.08.12 |
1. DICOM 태그란 무엇인가 – 태그의 의미와 역할 (2) | 2025.08.10 |