2011-09-21 69 views
2

在我的C#Silverlight應用程序中,我嘗試使用FJCore類庫來解碼壓縮的JPEG傳輸語法中的DICOM圖像。C#:使用Silverlight FJCore庫以12位精度解碼JPEG圖像?

的DICOM圖像通常與12位精度壓縮。當試圖使用原始FJCore源代碼解碼這樣的圖像時,我得到一個異常說「不支持的編解碼器類型」,因爲在最初的FJCore實現中,只有SOF0(基線DCT)和SOF2(逐行DCT)起始幀標記是支持的。如果我改變實現以接受SOF1標記(擴展順序DCT)並且以與SOF0幀相同的方式處理SOF1幀,則圖像被解碼,但僅佔8位。現在

一個典型的12位精度的圖像看起來是這個修改後的FJCore庫解碼後:

12-bit precision JPEG image encoded to 8-bit precision by FJCore

理想的情況下,圖像看起來應該是這樣:

12-bit precision JPEG image encoded to full 12-bit precision

據我從FJCore實現中可以看出,圖像精度記錄在JpegFrame類中,但從未使用過。原始的FJCore實現似乎只完全支持8位精度的灰度圖像。

我計劃「由不畏艱險」,並試圖擴大自己對FJCore支持12位精度的灰度圖像。但在此之前,我認爲我應該在StackOverflow中提出問題,以查看是否有人遇到並解決了此問題?在這種情況下,我很樂意瞭解您是如何解決問題的。

非常感謝提前!
Anders @ Cureos

+1

@Hans,很抱歉,您不喜歡我將問題發佈到SO的方式。 在世界上最好的,FJCore將有一個活着的和充滿活力的用戶或​​開發者論壇,但遺憾的是自2009年初以來 沒有開發或開發者互動的跡象我注意到,FJCore已經在SO討論了幾次(甚至有自己的標籤),所以我藉此機會在這裏發佈我的問題。 我並不是要求某人來完成這項工作,但如果有人知道12位精度問題的開源解決方案,這對我(以及潛在的其他開發人員)會有很大的幫助。 –

+1

在快速查看源代碼之後,似乎編解碼器能夠讀取12位圖像。 看着上面的圖片我會說,VOI/LUT變換必須應用於由FJCore返回的幀 編輯:我正在看圖像,現在它看起來不像VOI/LUT問題了。高位僅被截斷 –

+0

感謝Paolo花時間研究這一點。我懷疑是截斷錯誤;很高興你能夠證實這一點。 –

回答

2

我剛剛更新了我自己的JPEG解碼器來處理擴展模式,我需要改變的是我的逆DCT。在更改代碼之前,輸出看起來與上面的示例圖像相似。我一直存儲來自熵解碼的16位係數值,但是我的DCT計算通過使用16位整數在執行數學運算時保存臨時值來破壞較大的值。我將DCT代碼更改爲使用32位整數進行計算,並解決了這個問題。

+0

感謝您的建議,BitBank。我會盡快檢查FJCore代碼,看看它是否可以按照您的建議進行調整。 –

+0

我試了一下,但迄今沒有成功。當我有時間的時候,我會再嘗試幾次。 –

+0

隨時寫信給我更多的細節,我會幫你,如果我可以([email protected]) – BitBank