介紹如何使用 OrthancWSIDicomizer 轉檔工具,將 SVS 格式的數位病理全玻片影像(WSI)轉換為 DICOM 影像格式。
安裝 OrthancWSIDicomizer
若在 Ubuntu Linux 中,OrthancWSIDicomizer 這個工具屬於 orthanc-wsi
套件,可以使用 apt
安裝:
# 安裝 orthanc-wsi 套件
sudo apt install orthanc-wsi
而在讀取 SVS 檔案時還會需要 OpenSlide 函式庫,所以也要一併安裝 libopenslide0
套件:
# 安裝 libopenslide0 套件
sudo apt install libopenslide0
檢查 OpenSlide 函式庫動態連結檔位置,這個檔案隨後在使用 OrthancWSIDicomizer 的時候會需要:
# 檢查 OpenSlide 函式庫動態連結檔位置 dpkg -L libopenslide0 | grep '.so'
/usr/lib/x86_64-linux-gnu/libopenslide.so.0.4.1 /usr/lib/x86_64-linux-gnu/libopenslide.so.0
SVS 格式 WSI 影像轉 DICOM 格式
首先建立放置 DICOM 輸出檔案的目錄:
# 建立輸出目錄
mkdir output
若要將 CMU-1-Small-Region.svs
這個 SVS 格式的 WSI 影像轉為 DICOM 格式,可以使用以下 OrthancWSIDicomizer
指令:
# 將 SVS 格式 WSI 影像轉為 DICOM 格式 OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --folder=output \ CMU-1-Small-Region.svs
其中 --openslide
參數是指定 OpenSlide 函式庫動態連結檔的位置,而 --folder
參數則是指定輸出 DICOM 檔案放置的路徑,轉換的過程會有詳細的資訊輸出:
W1026 21:35:55.505449 FromDcmtkBridge.cpp:142] Loading the external DICOM dictionary "/usr/share/libdcmtk12/dicom.dic" W1026 21:35:55.513894 ApplicationToolbox.cpp:41] Performance warning in whole-slide imaging: Non-release build, runtime debug assertions are turned on W1026 21:35:55.513926 ApplicationToolbox.cpp:230] Orthanc WSI version: 0.4 W1026 21:35:55.518528 Dicomizer.cpp:820] The input image is: CMU-1-Small-Region.svs W1026 21:35:55.518602 Dicomizer.cpp:823] File format of the input image: TIFF E1026 21:35:55.518852 HierarchicalTiff.cpp:206] This is not a tiled TIFF image W1026 21:35:55.518918 Dicomizer.cpp:853] This is not a standard hierarchical TIFF file W1026 21:35:55.518937 Dicomizer.cpp:863] Trying to open the input pyramid with OpenSlide W1026 21:35:55.526923 Dicomizer.cpp:900] Compression of the individual source tiles: Unknown W1026 21:35:55.528827 Dicomizer.cpp:137] Size of source tiles: 512x512 W1026 21:35:55.528876 Dicomizer.cpp:138] Pixel format: RGB24 W1026 21:35:55.528890 Dicomizer.cpp:139] Smoothing is disabled W1026 21:35:55.528903 Dicomizer.cpp:150] No repainting of the background W1026 21:35:55.528914 Dicomizer.cpp:162] Size of target tiles: 512x512 W1026 21:35:55.528935 Dicomizer.cpp:166] Target image compression: Jpeg with quality 90 W1026 21:35:55.528953 Dicomizer.cpp:61] Creating level 0 of size 2220x2967 W1026 21:35:55.528983 Dicomizer.cpp:66] Transcoding the source pyramid W1026 21:35:55.529002 ApplicationToolbox.cpp:126] Running 30 tasks without multithreading W1026 21:35:55.542509 ApplicationToolbox.cpp:142] Progress: 3% W1026 21:35:55.555062 ApplicationToolbox.cpp:142] Progress: 6% W1026 21:35:55.566234 ApplicationToolbox.cpp:142] Progress: 10% W1026 21:35:55.576437 ApplicationToolbox.cpp:142] Progress: 13% W1026 21:35:55.581589 ApplicationToolbox.cpp:142] Progress: 16% W1026 21:35:55.592938 ApplicationToolbox.cpp:142] Progress: 20% W1026 21:35:55.603336 ApplicationToolbox.cpp:142] Progress: 23% W1026 21:35:55.614143 ApplicationToolbox.cpp:142] Progress: 26% W1026 21:35:55.623779 ApplicationToolbox.cpp:142] Progress: 30% W1026 21:35:55.628407 ApplicationToolbox.cpp:142] Progress: 33% W1026 21:35:55.639578 ApplicationToolbox.cpp:142] Progress: 36% W1026 21:35:55.651274 ApplicationToolbox.cpp:142] Progress: 40% W1026 21:35:55.662363 ApplicationToolbox.cpp:142] Progress: 43% W1026 21:35:55.673043 ApplicationToolbox.cpp:142] Progress: 46% W1026 21:35:55.677953 ApplicationToolbox.cpp:142] Progress: 50% W1026 21:35:55.688027 ApplicationToolbox.cpp:142] Progress: 53% W1026 21:35:55.699217 ApplicationToolbox.cpp:142] Progress: 56% W1026 21:35:55.710850 ApplicationToolbox.cpp:142] Progress: 60% W1026 21:35:55.720961 ApplicationToolbox.cpp:142] Progress: 63% W1026 21:35:55.726150 ApplicationToolbox.cpp:142] Progress: 66% W1026 21:35:55.736850 ApplicationToolbox.cpp:142] Progress: 70% W1026 21:35:55.748337 ApplicationToolbox.cpp:142] Progress: 73% W1026 21:35:55.760174 ApplicationToolbox.cpp:142] Progress: 76% W1026 21:35:55.770816 ApplicationToolbox.cpp:142] Progress: 80% W1026 21:35:55.776193 ApplicationToolbox.cpp:142] Progress: 83% W1026 21:35:55.786811 ApplicationToolbox.cpp:142] Progress: 86% W1026 21:35:55.796906 ApplicationToolbox.cpp:142] Progress: 90% W1026 21:35:55.807796 ApplicationToolbox.cpp:142] Progress: 93% W1026 21:35:55.817318 ApplicationToolbox.cpp:142] Progress: 96% W1026 21:35:55.821923 ApplicationToolbox.cpp:142] Progress: 100% W1026 21:35:55.824850 DicomPyramidWriter.cpp:183] Closing the DICOM pyramid (30 tiles were written) W1026 21:35:55.824906 TiledPyramidStatistics.cpp:40] Closing the input image (0 raw accesses to the tiles, 30 decoded tiles)
除了 SVS 格式的 WSI 之外,OrthancWSIDicomizer
也可以接受 TIFF 檔案格式的 WSI。
DICOM 標籤內容
OrthancWSIDicomizer
在將 WSI 影像轉為 DICOM 格式時,可以搭配 JSON 格式的檔案來設定 DICOM 標籤內容,使用 --sample-dataset
參數可以產生 JSON 格式的範本,包含最基本應該有的 DICOM 標籤。
我們可以利用以下指令產生 JSON 格式的範例檔案:
# 產生 JSON 格式 DICOM 標籤範例檔案 OrthancWSIDicomizer --sample-dataset > my_tags.json
產生的 JSON 檔案內容如下:
{ "PatientID" : "C123456789", "PatientName" : "SOME^PATIENT", "PatientBirthDate" : "19700101", "PatientSex" : "M", "StudyID" : "NONE", "SeriesNumber" : "1", "ReferringPhysicianName" : "SOME^PHYSICIAN", "AccessionNumber" : "123456789", "Manufacturer" : "MyManufacturer", "ManufacturerModelName" : "MyModel", "DeviceSerialNumber" : "MySerialNumber", "SoftwareVersions" : "MyVersion", "ImageType" : "DERIVED\\PRIMARY\\VOLUME\\NONE", "FocusMethod" : "AUTO", "ExtendedDepthOfField" : "NO", "AcquisitionContextSequence" : [ ], "AcquisitionDuration" : "100", "ContainerIdentifier" : "CI_12345", "IssuerOfTheContainerIdentifierSequence" : [ ], "ContainerTypeCodeSequence" : [ ], "IssuerOfTheContainerIdentifierSequence" : [ ], "SpecimenDescriptionSequence" : [ { "SpecimenIdentifier" : "Specimen^Identifier", "SpecimenUID" : "1.2.276.0.7230010.3.1.4.3252829876.4112.1426166133.871", "IssuerOfTheSpecimenIdentifierSequence" : [ ], "SpecimenPreparationSequence" : [ ] } ], "SpecimenLabelInImage" : "NO", "BurnedInAnnotation" : "NO" }
準備好 DICOM 標籤內容的 JSON 檔案之後,就可以透過 --dataset
參數指定 JSON 檔案,設定 DICOM 影像內的標籤:
# 透過 JSON 檔案設定 DICOM 標籤內容 OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --folder=output \ --dataset=my_tags.json \ CMU-1-Small-Region.svs
這裡雖然轉出的影像檔案是 DICOM 格式,但是不一定完全符合 DICOM 標準,在將 WSI 影像轉換為 DICOM 檔案之後,建議再使用 dciodvfy
與 dcentvfy
這兩項 DICOM 影像標準驗證工具來進行驗證,並修正錯誤或遺漏的 DICOM 標籤內容。
多執行緒
OrthancWSIDicomizer
預設會使用兩條執行緒以平行方式處理,若要更改其所使用的執行緒數量,可以使用 --threads
參數來指定:
# 使用 4 條執行緒平行處理 OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --folder=output \ --threads=4 \ CMU-1-Small-Region.svs
輸出檔案名稱
OrthancWSIDicomizer
預設會以 wsi-%06d.dcm
這個輸出樣板來命名輸出的 DICOM 檔案,若要更改輸出的檔案名稱樣板,可以使用 --folder-pattern
參數來指定:
# 指定輸出 DICOM 檔案名稱樣板 OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --folder=output \ --folder-pattern=output-%03d.dcm \ CMU-1-Small-Region.svs
單一 DICOM 檔案大小上限值
OrthancWSIDicomizer
預設會將每個輸出的 DICOM 影像檔案維持在 10MB 以下,讓大型的 WSI 影像分開以多個檔案儲存,避免產生過大的單一檔案,若要改變這個單一檔案的大小上限值,可以使用 --max-size
參數:
# 指定單一輸出 DICOM 檔案大小上限值j為 10MB OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --folder=output \ --max-size=10 \ CMU-1-Small-Region.svs
影像壓縮
OrthancWSIDicomizer
預設不會對影像的像素編碼進行轉換,只會維持原始的編碼直接放進 DICOM 檔案中,因此轉換速度非常快。
若要對影像像素資料進行重新編碼,則可將 --reencode
指定為 1
,並搭配 --compression
(可用選項有 none
、jpeg
、jpeg2000
)與 --jpeg-quality
(可用選項值為 0
到 100
)參數指定壓縮方式與壓縮率:
# 對像素資料重新編碼,指定壓縮方式與壓縮率 OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --folder=output \ --reencode=1 \ --compression=jpeg \ --jpeg-quality=90 \ CMU-1-Small-Region.svs
我們可以透過降低壓縮率的方式,節省 WSI 影像的硬碟儲存空間,例如設定 --jpeg-quality=90
。
重建各解析度層級影像
若將 OrthancWSIDicomizer
的 --pyramid
參數設定為 1
,可以重建各解析度層級影像,而搭配 --smooth
參數可以加入高斯模糊的平滑處理,有反鋸齒的效果,讓影像品質更好(不過會需要較久的計算時間):
# 重建各解析度層級影像,加入平滑處理 OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --folder=output \ --pyramid=1 \ --smooth=1 \ CMU-1-Small-Region.svs
若要指定解析度層級數,可以用 --levels
參數指定:
# 指定解析度層級數為 3 OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --folder=output \ --pyramid=1 \ --smooth=1 \ --levels=3 \ CMU-1-Small-Region.svs
Tile 大小
若要改變影像的 tile 大小,可以使用 --tile-width
與 --tile-height
參數來指定:
# 指定 tile 大小 OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --folder=output \ --tile-width=400 \ --tile-height=400 \ CMU-1-Small-Region.svs
組織切片資訊
以下是一些可以設定組織切片相關 DICOM 標籤資訊的參數,對應的數值為預設值:
--imaged-width=15
:寬度,(0048,0001) Imaged Volume Width。--imaged-height=15
:高度,(0048,0002) Imaged Volume Height。--imaged-depth=1
:厚度,(0048,0003) Imaged Volume Depth。--offset-x=20
:X 軸位置,(0040,072A) X Offset in Slide Coordinate System。--offset-y=40
:Y 軸位置,(0040,073A) Y Offset in Slide Coordinate System。
以下是一些進階參數:
--icc-profile
:設定 ICC Profile,(0028,2000) ICC Profile,預設為 sRGB。--optical-path
:設定 Optical Path。
這些參數也可以統一寫在 JSON 檔案中,透過 --dataset
參數統一設定。
上傳 Orthanc 伺服器
OrthancWSIDicomizer
的原始設計目的是為了將 WSI 影像上傳至 Orthanc 伺服器,若不使用 --folder
指定輸出 DICOM 影像輸出目錄,則預設會將輸出影像上傳至 http://localhost:8042/
的 Orthanc 伺服器。
我們可以使用 --orthanc
、--username
與 --password
參數指定 Orthanc 伺服器位址、使用者名稱與密碼:
# 指定 Orthanc 伺服器、使用者名稱與密碼 OrthancWSIDicomizer \ --openslide=/usr/lib/x86_64-linux-gnu/libopenslide.so.0 \ --orthanc=http://localhost:8042/ \ --username=orthanc \ --password=orthanc \ CMU-1-Small-Region.svs