python中原始图像的jpeg解压缩

2024-04-18 21:31:40 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图对原始数据进行JPEG解压缩(旧式JPEG压缩,而不是JPEG-LS和JPEG2000)时,我得到以下错误:

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

图像中的原始数据是14位JPEG数据,imageio无法读取。当我尝试使用pillow时,它甚至没有识别出JPEG格式的数据。我现在的问题是:如何在不编写自己的JPEG解压器的情况下解压数据,同时记住数据是14位的?在

我的代码:

^{pr2}$

文件raw_data.dat是一个纯粹包含用JPEG压缩的原始图像数据的文件。链接到raw_data.dat


Tags: inpyselfhomerawlibpackageslocal
2条回答

raw_data.dat是一个JPEG Lossless, Nonhierarchical文件,有2个帧和一个8位精度,这是一种非常罕见的格式。在

imagecodecs包可以读取文件(假设_imagecodecsCython扩展名存在):

>>> 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还应能够读取文件(未测试)。在

我相信这个问题可以通过使用不同的库来加载图像来解决。类似的潜在问题也被贴在这里How to combine 3 high range JPEG2000 images into single RGB one?。您可以使用以下方法:

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

然后,您可以使用读取位图进行进一步的操作,就好像它是通过PIL/Pillow/imageio加载的一样。在

相关问题 更多 >