先說結論
開啟 DICOM 閱片器,把整個裝著檔案的資料夾拖進去。它們會在你自己的機器上讀出來,各自歸回原來的序列,並按裝置拍攝的順序疊好。什麼都不會上傳,也不會往你的檔案裡寫回任何東西。
要是你拿到一張光碟,正猶豫該開哪個檔案:全部,一次性。一次 CT 或者 MR 不是一個檔案,是一層一個檔案,一次胸部檢查就是三百來個。
醫院給的光碟裡都有什麼
通常是四樣,而只有一樣要緊。
- 一個裝著影像的資料夾,名字常常是
DICOM、IMAGES或者ST0001,裡面的檔案叫IM000001、I0000001,或者一長串帶點的數字。很多時候壓根沒有字尾。這就是影像。 - 一個叫
DICOMDIR的檔案,是其餘部分的索引,寫出來是為了讓閱片器不必逐個開啟就能列出光碟上的檢查。你用不著它。 - 一個閱片器,可能是 Windows 的可執行檔案、一條自動執行項,偶爾是個 Java 小程式。它是照著刻盤那會兒的環境編譯的,所以那麼多都已經跑不起來了。
- 一個帶醫院標誌的 HTML 頁面或者 PDF,講怎麼啟動那個閱片器。
影像並不需要那個閱片器。這個格式是公開的標準,檔案自己就讀得了;光碟上那個可執行檔案只是能讀它們的一個程式,不是唯一的一個。
檔案為什麼沒有字尾
因為 DICOM 不需要。每個檔案都內建標記:128 個位元組的空白,然後是 DICM 這四個字母,再然後是一小塊欄位,說明這個檔案其餘部分是怎麼寫的。讀的一方查的是那四個字母,不是以 .dcm 結尾的名字。
這也是為什麼把檔名改成 .dcm 什麼也改變不了,以及為什麼一個非要字尾的閱片器是在沒必要地較勁。直接從醫院網路裡寫出來的檔案,連那 128 個位元組和那個標記都沒有,就是前面什麼都不加的裸資料,讀的一方得從它的第一個元素推斷出編碼方式。那是正常檔案,不是壞檔案。
窗寬窗位,這才是要緊的那個操作
這是讓一張醫學影像不同於一張照片的唯一一件事,也是影像編輯軟體不適合看它的原因。
一層 CT 裡大約有四千個不同的數值,你的螢幕只能顯示兩百五十六級灰。總得有什麼來決定這四千裡哪一些落到那兩百五十六裡,這個決定就是窗。比它低的全黑,比它高的全白,中間那一段鋪滿灰階。
挪一下窗,同一個檔案看著就像另一次檢查。這不是渲染出了毛病,這正是關鍵。肺和骨都在同一層裡,卻沒法同時看清:一個能看出充氣肺紋理的窗,會把所有骨頭變成純白;一個能看清肋骨骨小梁的窗,會把整個肺變成純黑。
CT 上的數值是亨氏單位,是絕對定義的,不是每臺機器各算各的:水是 0,空氣是 −1000,全世界每一臺 CT 都如此。所以閱片器才能給出帶名字的窗,肺窗、骨窗、腦窗、軟組織窗,而且它們在你的檔案上跟在那臺出報告的工作站上是同一個意思。常用的幾個是:
- 軟組織窗 | 窗位 40,窗寬 400。
- 肺窗 | 窗位 −600,窗寬 1500。
- 骨窗 | 窗位 300,窗寬 1500。
- 腦窗 | 窗位 40,窗寬 80。這個窗很窄,因為灰質和白質只差幾個單位。
MR 上沒有這樣的標度。數值取決於序列、線圈和機器,所以沒有什麼可以拿來給預設起名字,一開始用的窗就是檔案自己要求的那個。每一份影像都帶著一個建議。
為什麼有時候翻層的方向是反的
閱片器得決定把這些檔案按什麼順序排,而檔案裡有兩樣東西可以用。
Instance Number 是一個計數。這是最順手的選擇,可它是由寫這些檔案的東西分配的,沒有理由按病人躺著的方向去編號。一次從腳往上重建、卻從頭往下編號的檢查,翻起來就是倒的;而由兩次重建拼起來的一套序列,編號甚至可能直接重複。
Image Position (Patient) 說的是這一層實際在什麼位置,單位是毫米,而且用的座標系是釘在病人身上的,不是釘在機器上的。不管編號做了什麼,按它排都是對的,而且還有個有用的副產品:一旦層按物理位置排好了,層與層之間的距離就量得出來,於是閱片器可以告訴你層間距是 5 mm,也能發現少了一層,而這件事檔案本身從來不說。
量點什麼
影像是量出來的資料,所以在它上面量出的長度是真實長度,前提是檔案寫了畫素之間隔多遠。寫這個的只有一個欄位,Pixel Spacing,單位毫米,幾乎每一次 CT 和 MR 都有。
超音波影像、掃描檔,還有存成 DICOM 的螢幕截圖,常常沒有這一項。沒有的時候,毫米這個答案就不存在誠實的版本,而一個照樣給出毫米的閱片器是自己編了一個比例。畫素數是對一個檔案回答不了的問題給出的正確答案。
也要留意不是正方形的畫素,這在 CT 之外很常見。按畫素量再乘一個間距,只有在兩個方向相等時才對,每個方向都得用自己的那個數。
一份影像除了影像還帶著什麼
這是人們弄錯的地方,也是對這類檔案要小心的理由。
DICOM 檔案不是加了後設資料的圖片,是裝著圖片的病歷。頭資訊是一串欄位,在一次尋常的臨床影像上,裡面裝著:
- 病人的姓名、住院號、出生日期和性別;
- 檢查號,也就是在醫院系統裡回到那張申請單的鑰匙;
- 開單醫生、拍片技師、出報告的放射科醫生;
- 機構、機構地址和科室;
- 裝置的廠商、型號和序列號;
- 精確到秒的檢查日期和時間;
- 以及檢查、序列、例項的那幾個唯一識別符號,它們是回到出片檔案庫的完美鑰匙。
你拿到的任何一個檔案都帶著這全部,而且檔案走到哪裡它們就跟到哪裡。刪掉姓名是不夠的:一個出生日期、一個郵編大小範圍內的機構,加上一個檢查時間,認出一個人的本事跟姓名差不多;而檢查的 UID,對任何能進那個檔案庫的人來說,指認得分毫不差。
有些裝置還會把病人姓名的第二份副本放進一個私有欄位。那種欄位的含義沒有在任何地方公開過,而多數匿名化工具根本不動它,因為它們無從知道裡面裝著什麼。
別為了看一眼就把影像傳上去
這件事通常是這麼解決的:搜一下「dicom viewer online」,然後找到一個上傳框。而那一刻剛剛發生的事情是,一個陌生人手裡有了一份病歷的副本:畫素、姓名、出生日期、住院號,以及回到檔案庫的那把鑰匙。
根本沒有這個必要。讀一個 DICOM 檔案就是解析一段頭資訊、再把一些整數拆出來,瀏覽器做這個乾得很好。所以這裡的閱片器壓根沒有聯網功能:沒有 fetch,沒有 XMLHttpRequest,就算有什麼想送,也沒有東西送得出去。把頁面載入一次,斷網,它照樣開啟影像。
把檔案傳到線上轉換網站安全嗎?講了怎麼在本站或者任何別的站上核實這個說法。而這一類檔案,正是最值得核實的那一類。
瀏覽器做不到什麼
兩件事,而且兩件都值得說明白。
它不是診斷用的閱片器。你的螢幕沒有校準,瀏覽器不是經過驗證的渲染鏈路,也沒有哪個網頁透過過監管評估。為了做臨床判斷去讀一份影像,那是它出報告的那臺工作站的工作。看看光碟裡有什麼、取一層放進課件或者論文、讀頭資訊、弄清另一個程式為什麼拒收這個檔案,這些都是在瀏覽器裡開啟它的好理由。
有些壓縮過的影像解不開。DICOM 允許好幾種壓縮方案,瀏覽器實現了其中一種。未壓縮的檔案、run-length 編碼的檔案、baseline JPEG,還有醫院匯出時大多用的 JPEG Lossless,都打得開。JPEG 2000、JPEG-LS 和影片用的那幾種格式,需要好幾 MB 的編譯庫。影像解不開的時候,頭資訊照樣完整可讀,而那通常本來就是你要來看的那一半。