用于 RAW 图像导入的 dtype=uint10、uint12、uint14 的 Numpy 解决方法

问题描述 投票:0回答:0

将 16 位无符号原始(图像)数据导入 python 很简单:

data = numpy.fromfile( source_file, dtype=numpy.uint16 )
data = numpy.asarray( data )

但我还必须导入 10、12 和 14 位无符号整数数据,以便我可以将这些数据编码为专有图像格式。该格式只接受具有唯一标头的 16 位或 32 位整数数组。 Numpy 没有针对 10、12 和 14 位数据类型的实现。

当我在 ImageJ 中打开 10、12 或 14 位 RAW 作为 16 位无符号图像(这是 ImageJ 可用的最小无符号位深度)时,它看起来很有趣,但像素都在正确的位置。这是错误的位深度,所以我并不感到惊讶。

但是,如果我在 ImageJ 中以小端字节顺序打开 RAW,则 10 位图像在 ImageJ 中完美显示为 16 位无符号图像。所以我在 Python 中尝试这个:

image_bitness = numpy.uint16
image_bitness = numpy.dtype( image_bitness ).newbyteorder( '<' )
data = numpy.fromfile( source_file, dtype=image_bitness )
data = numpy.asarray( data )

将字节顺序交换为小端字节序在 python 中没有效果。当我在 python 中将图像转换为新格式,然后在 ImageJ 中打开这个新图像时,图像看起来仍然很有趣。

我已经为 16 位和 32 位无符号 RAW 实现了相同的文件转换,并且效果很好。

总结一下:

  • 10、12 或 14 位无符号数据类型的实际解决方法是问题

  • 不确定一般如何最好地将 10 位转换为 16 位,特别是如果我必须假设 16 位来调用

    numpy.fromfile( source_file, dtype=numpy.uint16 )
    以最初获取数据数组(参见附录)

  • 不确定为什么 ImageJ little endian 能正确显示图像。将小端图像视为大端图像可能会完全扰乱图像。也许我错了。

  • 不确定为什么在 Python 中交换字节顺序与 ImageJ 的效果不同

附录:填充 base-2 二进制以获得 16 位

我想我可以用 0 填充我的 base-2 二进制数,然后转换回 base-10 整数。我试过这个:

data = numpy.fromfile( source_file, dtype=numpy.uint16 ) #still compiles for 10-bit image?    
for i in data:
      data[i] = int( bin( data[i] )[2:].zfill(16), 2 )
data = numpy.asarray( data ) 

这会将

0000001011
转换为
0000000000001011
作为字符串,然后将该字符串转换回以 10 为底的整数。

但是 - 当我在转换后在 ImageJ 中打开我的图像时,它看起来仍然很时髦。我假设这是因为

0000001011
0000000000001011
1011
仍然是相同的数字。我如何基本上强制分配更大的内存?

我还尝试通过逐字交换字节来交换字节顺序:

for i in data:
      data[i] = int( bin( data[i] )[2:].zfill(16)[::-1], 2 )

这将转置我的字符串,所以

0001
变成
1000
。结果是一样的。在 ImageJ 中仍然是一个看起来很有趣的图像。

numpy binary imagej raw
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.