我有一张医学 16 位无符号 jpeg 图像,我需要用 python 读取它。 对于我的项目,这些图像只能通过 mathlab 读取,我需要读取其实际像素值,并需要对该值进行一些数学运算。 您可以在以下链接中找到图片
https://drive.google.com/file/d/0B4l5GiM7kBXraDEyMXdseENfUlE/edit?usp=sharing
当我被要求在 mathlab 中获取图像信息时,将出现以下描述。
i = imfinfo('di.jpg')
i =
Filename: [1x56 char]
FileModDate: '14-Jul-2014 15:22:13'
FileSize: 1044064
Format: 'jpg'
FormatVersion: ''
Width: 1024
Height: 1024
BitDepth: 16
ColorType: 'grayscale'
FormatSignature: ''
NumberOfSamples: 1
CodingMethod: 'Huffman'
CodingProcess: 'Lossless'
Comment: {'Created by AccuSoft Corp.'}
我已经使用 matplotlib、opencv、scikitImage、scipy、medpy、PIL 库在 python 中读取此图像。 我无法阅读这些类型的图像。
当我在 python 中使用时,出现以下错误 代码: 导入图像 img = Image.open('di.jpg') 打印(img)
raise IOError("cannot identify image file")
IOError: cannot identify image file
请帮忙解决我的问题
最佳答案
这似乎是 How we can read 16 un signed integer(16 uint) jpeg files in python 的副本
我在 https://drive.google.com/file/d/0B4l5GiM7kBXraDEyMXdseENfUlE/edit?usp=sharing 查看了您的图片.可以明确的是,它是一张采用哈夫曼编码的 16 位灰度无损 JPEG 图像。但是,对于无损编码,至少有:
- JPEG 无损(稀有,旧)
- JPEG-LS(很少见,没那么老)
- JPEG2000(更新)
有关这些的更多信息,请参阅:http://en.wikipedia.org/wiki/Lossless_JPEG
cel
在他们的评论中提到的GDCM
库使用CharLS
库来读取JPEG-LS。这个库确实有 Python 绑定(bind),但不幸的是拒绝加载图像,因为它不是 JPEG-LS 文件。 (但是,YMMV,请参阅下面的 malat
评论。)
我还尝试查询 ImageMagick
的 identify
,它提供了更多信息:
identify.im6: Unsupported JPEG process: SOF type 0xc3 `/tmp/di.jpg' @ error/jpeg.c/JPEGErrorHandler/316.
现在 SOF 类型在 JPEG 中很重要。错误消息表明有问题的文件是“JPEG 无损”文件。 (这可能是因为它采用了霍夫曼编码这一事实。)令人讨厌的是,这种类型的文件中使用的编码方案与标准 JPEG 完全不同,标准 JPEG 库不支持它。
似乎有两个至少两个支持文件格式的开源库:
- IJG 的 JPEG 库版本 6b(旧!)打了一个特殊补丁
- Thomas Richter 的 LibJPEG:https://github.com/thorfdbg/libjpeg
我尝试了后者,它的命令行工具确实识别了该文件并将其解码为更有用的东西(灰度 PPM 文件)。
因此,这至少提供了一条路线。您必须编译并安装该库,然后为其创建必要的 Python 绑定(bind)。或者,您可以将命令行工具用作外部转换工具,并使用例如 subprocess
运行它们。最佳方法取决于您的平台。
关于python - 如何在 Python 中读取 16Uint 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24837867/