JPEG-декомпрессия на RAW-изображение в python

Когда я пытаюсь распаковать в JPEG-формате (сжатие JPEG старого стиля, а не JPEG-LS и не JPEG2000) данные RAW, я получаю следующую ошибку:

Traceback (most recent call last):
  File "raw-reader.py", line 766, in <module>
    raw_image_data = imageio.imread(io.BytesIO(raw_packed_image_data))
  File "/home/ian/.local/lib/python3.6/site-packages/imageio/core/functions.py", line 206, in imread
    reader = read(uri, format, 'i', **kwargs)
  File "/home/ian/.local/lib/python3.6/site-packages/imageio/core/functions.py", line 129, in get_reader
    return format.get_reader(request)
  File "/home/ian/.local/lib/python3.6/site-packages/imageio/core/format.py", line 168, in get_reader
    return self.Reader(self, request)
  File "/home/ian/.local/lib/python3.6/site-packages/imageio/core/format.py", line 217, in __init__
    self._open(**self.request.kwargs.copy())
  File "/home/ian/.local/lib/python3.6/site-packages/imageio/plugins/pillow.py", line 398, in _open
    pilmode=pilmode, as_gray=as_gray)
  File "/home/ian/.local/lib/python3.6/site-packages/imageio/plugins/pillow.py", line 122, in _open
    self._im = factory(self._fp, '')
  File "/home/ian/.local/lib/python3.6/site-packages/PIL/JpegImagePlugin.py", line 780, in jpeg_factory
    im = JpegImageFile(fp, filename)
  File "/home/ian/.local/lib/python3.6/site-packages/PIL/ImageFile.py", line 102, in __init__
    self._open()
  File "/home/ian/.local/lib/python3.6/site-packages/PIL/JpegImagePlugin.py", line 339, in _open
    handler(self, i)
  File "/home/ian/.local/lib/python3.6/site-packages/PIL/JpegImagePlugin.py", line 166, in SOF
    raise SyntaxError("cannot handle %d-bit layers" % self.bits)
SyntaxError: cannot handle 14-bit layers

Данные RAW на изображении - это 14-битные данные JPEG, и imageio не может их прочитать. Когда я попытался использовать подушку, он даже не распознал данные в формате JPEG. Теперь у меня вопрос: как я могу распаковать данные, не записывая собственный JPEG-декомпрессор, помня, что данные имеют размер 14 бит?

Мой код:

import io
import imageio

allbytes = open("raw_data.dat", "rb").read()

raw_packed_image_data = allbytes
raw_image_data = imageio.imread(io.BytesIO(raw_packed_image_data))

Файл raw_data.dat это файл, содержащий данные RAW-изображения, сжатые в формате JPEG Ссылка на raw_data.dat

2 ответа

raw_data.dat это JPEG Lossless, Nonhierarchical файл с 2 кадрами и точностью> 8 бит, очень редкий формат.

Пакет imagecodecs может прочитать файл (при условии, что _imagecodecs Расширение Cython присутствует):

>>> from imagecodecs import jpegsof3_decode
>>> data = open('raw_data.dat', 'rb').read()
>>> image = jpegsof3_decode(data)
>>> image.shape
(3528, 2640, 2)
>>> image.dtype
dtype('uint16')

LEADTOOLS SDK также должен быть в состоянии прочитать файл (не проверено).

Я считаю, что проблему можно решить с помощью другой библиотеки для загрузки изображения. Подобная основная проблема была опубликована здесь. Как объединить 3 изображения JPEG2000 с высоким диапазоном в одно RGB-изображение?, Вы можете использовать что-то вроде этого:

import matplotlib.image as mpimg
img_red = mpimg.imread('raw_data.dat')

Затем вы можете использовать битовый массив чтения для дальнейшей манипуляции, как если бы он был загружен через PIL/Pillow/imageio.

Другие вопросы по тегам