python 中 RAW 图像的 JPEG 解压缩
JPEG-Decompression on RAW image in python
当我尝试对 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 无法读取它。当我尝试使用 pillow 时,它甚至无法将数据识别为 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图像数据的文件。 Link 到 raw_data.dat
我相信使用不同的库加载图像可以解决这个问题。类似的潜在问题已在此处发布 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 加载的一样。
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 应该也可以读取文件(未测试)。
当我尝试对 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 无法读取它。当我尝试使用 pillow 时,它甚至无法将数据识别为 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图像数据的文件。 Link 到 raw_data.dat
我相信使用不同的库加载图像可以解决这个问题。类似的潜在问题已在此处发布 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 加载的一样。
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 应该也可以读取文件(未测试)。