C #: Декодирование изображений JPEG с 12-битной точностью с использованием библиотеки Silverlight FJCore? - PullRequest
2 голосов
/ 21 сентября 2011

В моем приложении C # Silverlight я пытаюсь декодировать изображения DICOM с использованием сжатого синтаксиса передачи JPEG, используя библиотеку классов FJCore .

Изображения DICOM обычно сжимаются с помощью 12-разрядноготочность.При попытке декодировать такое изображение с использованием исходного исходного кода FJCore, я получаю исключение, говорящее «Неподдерживаемый тип кодека», потому что в исходной реализации FJCore только маркеры начала кадра SOF0 (Baseline DCT) и SOF2 (Progressive DCT)поддерживается.Если я изменю реализацию, чтобы также принять маркер SOF1 (Extended Sequential DCT) и обрабатывать кадры SOF1 так же, как кадры SOF0, изображения декодируются, но учитываются только 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 Ответ

2 голосов
/ 05 января 2012

Я только что обновил свой собственный JPEG-декодер для обработки расширенного режима, и мне нужно было изменить мой обратный DCT. Перед изменением кода вывод выглядел аналогично вашему образцу изображения выше. Я всегда сохранял 16-битные значения коэффициента от энтропийного декодирования, но мои вычисления DCT искажали большие значения с помощью 16-битных целых чисел для хранения временных значений при выполнении математических операций. Я изменил код DCT, чтобы использовать для расчетов 32-битные целые числа, и это решило проблему.

...