介紹如何使用 Python 的 OpenPhi 模組,讀取 PHILIPS iSyntax 格式的數位病理全玻片影像(WSI)。
iSyntax 是 PHILIPS 公司所使用的 WSI 影像格式,應用小波轉換技術加速 WSI 影像縮放與平移動作,並且也避免了「金字塔」格式在低倍率圖像的冗餘存儲,大幅降低影像檔案大小,降幅達 25%,除此之外 iSyntax 格式也沒有位元深度(bit-depths)與通道(channels)數上限,詳細的說明可以參考 PHILIPS Pathology SDK。
若要使用 Python 的 OpenPhi 模組讀取 PHILIPS iSyntax 格式的 WSI 影像,需要先安裝 PHILIPS Pathology SDK,請從 PHILIPS 網站 下載 Philips Pathology SDK 的安裝檔案 PathologySDK_2.0-L1_Packages.zip
,解壓縮之後進行安裝。
Pathology SDK 對於 Python 的版本有嚴格的限制,以 Ubuntu Linux 20.04 來說,需要 Python 3.8 版,安裝前要先檢查 Python 的版本:
# 檢查 Python 版本 python3 --version
Python 3.8.10
其他作業系統與版本資訊請參考 Pathology SDK 的說明手冊。
解壓縮下載的 PathologySDK_2.0-L1_Packages.zip
壓縮檔:
# 解壓縮 ZIP 檔案
unzip PathologySDK_2.0-L1_Packages.zip
在 PathologySDK_2.0-L1_Packages
目錄中包含了各種作業系統的安裝檔,進入 Ubuntu20.04
目錄並解壓縮 python 的 research 版本:
# 進入對應的作業系統目錄 cd PathologySDK_2.0-L1_Packages/Ubuntu20.04/ # 解壓縮 ZIP 檔案 unzip philips-pathologysdk-2.0-L1-ubuntu20_04_py38_research.zip
進入安裝檔目錄,啟用安裝檔的執行權限後,以管理者權限執行安裝:
# 進入安裝檔目錄 cd philips-pathologysdk-2.0-L1-ubuntu20_04_py38_research/ # 啟用執行權限 chmod +x InstallPathologySDK.sh # 以管理者權限執行安裝 sudo ./InstallPathologySDK.sh
安裝完成後,要確認是否有以下安裝成功的訊息:
PathologySDK2.0-L1 successfully installed
安裝完成 Philips Pathology SDK 之後,接著以 pip 安裝 OpenPhi 模組。
# 安裝 OpenPhi 模組
pip3 install openphi
安裝完成之後,即可使用 OpenPhi 模組撰寫 Python 指令稿讀取 PHILIPS iSyntax 的 WSI 影像了,詳細的說明可以參考 OpenPhi 的網站。
下載 iSyntax 格式的 WSI 影像範例檔案:
# 下載 iSyntax 格式的 WSI 影像範例檔案
wget https://www.ectopic.eu/files/sample.isyntax
以下是一個使用 OpenPhi 模組讀取 PHILIPS iSyntax 的 WSI 影像的範例:
from openphi import OpenPhi # 讀取 iSyntax 影像檔案 im = OpenPhi("sample.isyntax") # 取得層級數,以及各層級解析度與降解析度因子 numlevels = im.level_count dimensions = im.level_dimensions downsamples = im.level_downsamples # 取得一些後設資料 pixelsize = im.properties['openslide.mpp-x'] scanningtime = im.properties['DICOM_ACQUISITION_DATETIME'] # 取得標註與巨觀影像 labelim = im.associated_images['label'] macroim = im.associated_images['macro'] # 取得解析度不超過 2000x2000 的縮圖 thumbnail = im.get_thumbnail(size=(2000,2000)) # 讀取層級 3 的整張 WSI 影像,背景設為白色 wsi = im.read_wsi(level=3, bgvalue=255, channels="RGB") # 讀取座標位置為 (4000,2000) 大小為 512x512 的一塊 tile 影像 tile = im.read_region(location=(4000,2000), level=0, size=(512,512)) # 關閉影像 im.close()
這裡讀取出來的影像都是 pillow 的 Image
類型,若要對影像作進一步處理或顯示,可以參考 pillow 的網站說明。