免費工具

OrthancWSIDicomizer:數位病理全玻片影像 WSI 轉 DICOM 格式工具教學與範例

介紹如何使用 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 檔案之後,建議再使用 dciodvfydcentvfy 這兩項 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(可用選項有 nonejpegjpeg2000)與 --jpeg-quality(可用選項值為 0100)參數指定壓縮方式與壓縮率:

# 對像素資料重新編碼,指定壓縮方式與壓縮率
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

參考資料

Share
Published by
Office Guide

Recent Posts

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

本篇介紹如何在 Python ...

9 個月 ago

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

本篇介紹如何在 Ubuntu ...

9 個月 ago

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

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

9 個月 ago

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

本篇介紹如何在 Windows...

10 個月 ago

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

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

11 個月 ago

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

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

11 個月 ago