介紹如何透過 CTP DICOM Filter 的語法,撰寫影像篩選條件的指令稿,檢查與過濾 DICOM 影像資料。
CTP DICOM Filter 是 CTP 處理流程中的一個處理步驟(stages),可透過指令稿所定義的篩選條件,從處理流程中挑出不符合條件的 DICOM 影像,存放於指定的隔離目錄下。
CTP DICOM Filter 指令稿是由一個或多個判斷條件所組成的,判斷條件的基本結構如下:
identifier.method("string")
其中 identifier
為 DICOM 的標籤,而 method("string")
則為匹配方法。
DICOM 的標籤可以使用 dcm4che 所定義的名稱或十六進位代碼來表示,例如:
SOPInstanceUID
[0008,0018]
若要表示 DICOM 的巢狀結構,可以使用雙冒號(::
)分隔各層的 DICOM 標籤,例如:
SeqOfUltrasoundRegions::RegionLocationMinY0
[0018,6011]::[0018,601A]
SeqOfUltrasoundRegions::[0018,601A]
對於 DICOM 影像中的私有標籤(Private Data Elements),可以使用標準的十六進位代碼來表示,或是採用 Private Creator Data Element 的內容來表示。假設 [0029,0011]
這個 Private Creator Data Element 內容為 XYZ CT HEADER
,則 [0029,1140]
這個私有標籤則可用以下兩種方式表示:
[0029,1140]
[0029[XYZ CT HEADER]40]
私有標籤構成的巢狀結構,也是同樣以雙冒號分隔各層的標籤,例如:
[0029[XYZ CT HEADER]40]::[0017[ALIGNMENT HEADER]42]
在 CTP DICOM Filter 的指令稿中可以使用以下幾種匹配方法,對 DICOM 標籤內容進行比對,若比對成功則傳回 true
,否則傳回 false
:
方法 | 說明 |
---|---|
equals("string") |
完全等於 string 。 |
equalsIgnoreCase("string") |
完全等於 string ,不分大小寫。 |
equals("regex") |
符合 regex 所指定的正規表示法。 |
contains("string") |
包含 string 。 |
containsIgnoreCase("string") |
包含 string ,不分大小寫。 |
startsWith("string") |
以 string 開頭。 |
startsWithIgnoreCase("string") |
以 string 開頭,不分大小寫。 |
endsWith("string") |
以 string 結尾。 |
endsWithIgnoreCase("string") |
以 string 結尾,不分大小寫。 |
isLessThan("value") |
數值小於 value 。 |
isGreaterThan("value") |
數值大於 value 。 |
如果在對 DICOM 影像進行標籤內容比對時,若指定的 DICOM 標籤不存在,則會視為空字串(""
)。
isLessThan
與 isGreaterThan
在進行比對之前,會對 DICOM 標籤內容與指定參數進行前處理,將所有非數值的字元去除,將資料轉為雙精度浮點數(double precision floating point values)之後,再進行比對,若轉換失敗則傳回 false
。
所有雙斜線(//
)之後到結尾的內容都會被視為註解,例如:
// 這是註解 PatientName.equals("xyz") // 這也是註解
若要結合多種不同的判斷條件,可以使用邏輯運算子以及括號:
運算子 | 說明 |
---|---|
+ |
OR 運算子。 |
* |
AND 運算子。 |
! |
NOT 運算子。 |
() |
優先運算。 |
以下是使用邏輯運算子的範例:
// ImageType 包含 SECONDARY 或 DERIVED ImageType.contains("SECONDARY") + ImageType.contains("DERIVED") // ImageType 不包含 SECONDARY 或 DERIVED !(ImageType.contains("SECONDARY") + ImageType.contains("DERIVED")) // ImageType 不包含 SECONDARY 或 DERIVED !ImageType.contains("SECONDARY") * !ImageType.contains("DERIVED")