将 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 中仍然是一个看起来很有趣的图像。