개발/DICOM 태그 구조 마스터하기

2. DICOM 데이터 요소의 4가지 구성요소 – Tag, VR, Length, Value

devbake 2025. 8. 11. 12:00

DICOM 태그는 의료 영상 파일 안에서 특정 정보를 지정하고 해석하기 위한 표준화된 식별자다.
그러나 태그 하나만으로 모든 정보를 담을 수는 없으며, 태그와 함께 VR(Value Representation), Length, Value라는 세 가지 필드가 결합되어 하나의 "데이터 요소(Data Element)"를 구성한다. 이 네 가지 요소는 의료 영상의 주소·형식·길이·실제 값을 완벽히 정의하며, 단 하나라도 잘못 저장되면 파일 전체를 읽을 수 없는 오류가 발생할 수 있다.

이번 글에서는 각 요소의 역할과 저장 방식, 그리고 실제 DICOM 파일 내에서 어떻게 배치되는지까지 단계별로 분석한다.

 

DICOM 데이터 요소의 4가지 구성요소 – Tag, VR, Length, Value

 

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 표준 문서에 정의
  • 주의: 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이 잘못 지정되면 값 파싱 불가

 

 

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 구조 예시

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

해석

  1. Tag: 08 00 20 00 → (0008,0020)
    • Group 0008(일반 Study/Series/Instance 정보)
    • Element 0020(Study Date)
  2. VR: 44 41 → DA (Date)
  3. Length: 08 00 → 8바이트
  4. 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 방식을 실제 예제와 함께 설명한다.