免費工具

CTP 去識別化 ID 對照表使用教學與範例

介紹如何使用 CTP 的 ID 對照表功能,依據事先定義的 ID 轉換清單,將 DICOM 影像中的含有 PHI 資訊的 ID 資料轉為匿名化或假名化的 ID 識別碼。

CTP Lookup Table 格式

CTP 的對照表(lookup table)功能可以讓 DICOM Anonymizer 在進行去識別化處理時,依據使用者定義的對照表將病人的 PHI 資料(例如 PatientID)轉換為匿名化或假名化的 ID 識別碼,以便連結同病人的其他類型資料。

CTP 對照表的格式為一行一筆資料,格式如下:

類型/原始ID=去識別ID

由於 CTP 對照表可以同時存放多種類型的 ID 對照表,所以在每一筆資料的開頭必須指定資料的類型,類型的命名可以是任何文字(但不能是冒號、等號或空白),DICOM Anonymizer 會依據類型連進行 ID 轉換。

若遇到事先已經轉換好的 ID,也可以在對應表中使用以下格式來設定:

..已去識別ID=

以下是一個簡單的 CTP 對照表範例,包含了 PatientID 的對照資訊(ptid 是自訂的類別,代表用於 PatientID 的轉換):

#LookupTable.properties
#Mon Oct 25 09:19:57 CST 2021
ptid/8989193730=ABC001
ptid/9189822998=ABC002
..9894340694=

依據這張對應表,DICOM Anonymizer 會進行以下轉換:

  • ptid 類型的 8989193730 轉換為 ABC001
  • ptid 類型的 9189822998 轉換為 ABC002
  • 9894340694 維持不變。

以下我們將示範如何將這張對應表應用在 CTP 的 DICOM Anonymizer 去識別化流程中。

DICOM Anonymizer 使用對照表

DICOM Anonymizer 可以搭配以下幾種方式,依據 CTP 對照表進行 ID 轉換。

@lookup 函數

如果在一個專案中,不是所有的資料或影像都由 CTP 統一處理,只有一部分的 DICOM 影像使用 CTP Anonymizer 做去識別化,這種情況下通常在處理所有資料的去識別化之前,會先建立一張整體的去識別化 ID 對照表,所有的資料都根據這張表來進行去識別化,統一去識別化後的 ID 編碼,以利串接不同的資料。

在這樣的情況下,就適合使用 CTP Anonymizer 的 @lookup 函數,依據 ID 對應表來轉換 DICOM 影像中的 ID,其語法如下:

@lookup(ElementName,KeyType)

其中 ElementName 為 DICOM 標籤名稱,而 KeyType 則為對照表中的資料類型,此函數會根據 ElementName 的內容,依據對應表中 KeyType 類型的對應進行資料轉換,如果遇到對應表中查不到的值,則該 DICOM 影像就會隔離出來,存放在隔離目錄中。

若要依據上面的對照表範例,轉換 PatientID 的資料,可以這樣寫:

@lookup(PatientID,ptid)

若這個函數用於 PatientID 本身,則可以用 this 的寫法(代表目前的 DICOM 標籤):

@lookup(this,ptid)

@lookup 函數還有另外一種形式的語法:

@lookup(ElementName,KeyType,action)

這種形式多了一個 action 參數,可用來定義在對應表中查不到值的時候,預設的處理方式,可用的選項有:

  • remove:移除 DICOM 標籤。
  • keep:保留 DICOM 標籤內容,不更動。
  • empty:清除 DICOM 標籤內容。
  • skip:跳過去識別化步驟。
  • default:以預設值取代,若使用此參數,則必須在第四個參數指定預設值。
  • ignore:以正規表示法處理,若使用此參數,則必須在第四個參數指定正規表示法。

更詳細的說明可以參考 DICOM Anonymizer 的說明。

@integer 函數

如果專案中所有的資料與影像都統一由 CTP 來處理去識別化,這種狀況就可以考慮使用 @integer 函數對所有資料的 ID 自動重新編碼,而不需要另外預先建立 ID 對照表。

@integer 函數可以自動依序產生 ID 編號,其使用方式如下:

@integer(ElementName,KeyType,width)

其中 ElementName 為 DICOM 標籤名稱,而 KeyType 則為資料類型,而 width 則是產生編號的位數。

假設若想產生 001002003 這樣的 ID 編號作為去識別化的 PatientID,可以這樣寫:

@integer(this,ptid,3)

這裡的 KeyType@lookup 中的 KeyType 作用有些差異,此處的以 KeyType 區隔資料類型的用意在於讓不同資料在產生 ID 編號時不會互相干擾。舉例來說,若 PatientID 採用 @integer(this,ptid,3) 產生 001002003 這樣的編號,而 PatientName 則可採用 @integer(this,ptname,3) 同樣產生 001002003 這樣的編號,兩邊的編號就可以完全獨立,不會因為互相干擾產生錯誤。

@hashptid 函數

@hashptid 函數可以透過 MD5 雜湊的方式,將原始 ID 轉換為去識別化的 ID,其語法如下:

@hashptid(siteID,ElementName,maxCharsOutput)

其中 siteID 是機構或地點的 ID,ElementName 為 DICOM 標籤名稱,@hashptid 函數會依據這兩個資訊計算出 MD5 雜湊碼,轉為 10 進位的數字之後,輸出長度在 maxCharsOutput 以內的數字。

若要以 @hashptid 依據指令稿定義的 SITEID 與目前的 DICOM 標籤內容,產生長度不超過 16 的雜湊碼,則可以這樣寫:

@hashptid(@SITEID,this,16)

根據 DICOM 規範 PatientID 的長度不可以超過 64,所以如果要以 @hashptid 產生去識別化的 PatientIDmaxCharsOutput 最大只能設為 64

IDMap

如果影像資料在透過 CTP 進行去識別化之後,需要保留原始 ID 與去識別化 ID 的對照表,可以在 Dicom Anonymizer 之前加入一個 IDMap 處理步驟,將原始 ID 與去識別化 ID 的對照表儲存下來,詳細說明請參考 IDMap 的說明文件

參考資料

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

11 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago