介紹如何使用 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 則是產生編號的位數。
假設若想產生 001、002、003 這樣的 ID 編號作為去識別化的 PatientID,可以這樣寫:
@integer(this,ptid,3)
這裡的 KeyType 跟 @lookup 中的 KeyType 作用有些差異,此處的以 KeyType 區隔資料類型的用意在於讓不同資料在產生 ID 編號時不會互相干擾。舉例來說,若 PatientID 採用 @integer(this,ptid,3) 產生 001、002、003 這樣的編號,而 PatientName 則可採用 @integer(this,ptname,3) 同樣產生 001、002、003 這樣的編號,兩邊的編號就可以完全獨立,不會因為互相干擾產生錯誤。
@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 產生去識別化的 PatientID,maxCharsOutput 最大只能設為 64。
IDMap
如果影像資料在透過 CTP 進行去識別化之後,需要保留原始 ID 與去識別化 ID 的對照表,可以在 Dicom Anonymizer 之前加入一個 IDMap 處理步驟,將原始 ID 與去識別化 ID 的對照表儲存下來,詳細說明請參考 IDMap 的說明文件。

