最近在試著用 Tesseract 來做 DICOM 影像的 OCR,身為 Ruby 的愛好者,先去找了 RTesseract 這個 gem 來用,裡面已經把 RMagick (ImageMagick 的 ruby wrapper) 也整合好了,其實還算方便,不過問題在於,我在 Mac 上測試好的程式放到 Ubuntu 12.04 上去跑就是會有問題,拆解元件、交叉測試後發現應該是 ImageMagick 惹的禍:
$ convert spg.dcm spg.jpg
convert: memory allocation failed `spg.dcm' @ error/dcm.c/ReadDCMImage/3502.
convert: missing an image filename `spg.jpg' @ error/convert.c/ConvertImageCommand/3011.
花了一些時間東翻西找資料,數年前曾有人回報在 64-bit 系統下有類似的問題,但後來的回覆又說更新到 6.3.9 版以後就 ok 了,話說 Ubuntu package 是 6.6.9.7,感覺應該不會是重蹈覆轍的緣故吧?
後來想,會不會是 Ubuntu 12.04 太舊了,趁機來換成新的 LTS 版本好了,所以試裝了 Ubuntu 14.04,裡面的 ImageMagick 更新到 6.7.7 版,但還是有同樣的問題。既然之前有人反應是 64-bit 的問題,所以我又試了 12.04 32-bit 版(14.04 已經沒有 32-bit 版了),還是不行。另外,我甚至打算跳槽到 CentOS 去,在 CentOS 6.5 下(IM 的版本忘了),雖然可以成功的把 DICOM 轉成 Jpeg 檔,但格式有問題啊,檔案大小整個不對,也不知道是哪裡有問題,於是便放棄轉換 OS 的念頭。
這樣看起來有可能是 ImageMagick 本身版本的問題,所以便直接去下載最新版的 source 回來 compile,但不論我怎麼加參數 --with-jp2
, --with-openjp2
, 甚至直接去改了 Makefile 的 LIBOPENJP2_CFLAGS
, LIBOPENJP2_LIBS
等等,都無法正確編譯或 link。
因為我和 PACS 溝通是透過 WADO 機制,在 WADO 的規範裡有提到可以透過傳遞 contentType
參數(image/jpeg MIME type),可以在 server 端轉換成 jpeg 再傳回來,但可惜敝單位的 WADO server 沒有實作這功能。
最後的解法是先透過 GDCM 把 DICOM 影像 decompress(gdcmconv -w
),再丟給 tesseract 去做 OCR,聽起來好像有點脫褲子放屁,多此一舉的感覺,但這也是沒有辦法的辦法了。
後記 (8/21)
雖然後來透過自己 compile 最新版 openjp2 和 ImageMagick 的方式來解決轉換 DICOM 檔和解 JPEG 2000 壓縮的問題,但實際放到 OCR 的程式裡去測,反而是脫 GDCM 褲子放屁這招比較快,有種做白工的感覺。^^a