【问题标题】:JPEG-Decompression on RAW image in pythonpython中RAW图像的JPEG解压
【发布时间】:2018-07-20 12:20:03
【问题描述】:

当我尝试对 RAW 数据进行 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

图像中的 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 是一个纯粹包含用JPEG 压缩的RAW-Image 数据的文件。链接到raw_data.dat

【问题讨论】:

  • 请添加代码,而不仅仅是堆栈跟踪。
  • @sophros 我添加了我的代码。
  • 我相信我们需要更多。你读过MCVE吗?如果没有,请这样做并在此处申请。
  • 例如没有人知道raw_tags 可能是什么。代码摘录不是独立的。
  • @sophros 我添加了一个 MCVE!

标签: python jpeg compression python-imageio rawimage


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我相信可以使用不同的库来加载图像来解决这个问题。类似的潜在问题已在此处发布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 加载的一样。

    【讨论】:

    • 我编辑了我的问题以指定我需要哪种类型的 JPEG 解压缩(在 TIFF 中,它是压缩索引 6)。此外,当我尝试使用mpimg 时,当我使用BytesIO 时我得到ValueError: invalid PNG header,当我从文件中读取时我得到OSError: cannot identify image file 'raw_data.dat'
    猜你喜欢
    • 2013-02-22
    • 2012-07-30
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多