Python中字节数组到16位灰度图像的转换

Python中字节数组到16位灰度图像的转换,python,image-processing,Python,Image Processing,我正在处理以非标准图像格式(.Tsm)存储的大型图像数据集。本质上,它是一个二进制文件,开头有一些头,与FITS标准非常相似,只是存储在little-endian中,而不是FITS-big-endian中 在读取文件头并格式化元数据之后,我可以使用以下代码读取单个图像 def __read_slice(self, file, img_num, dimensions): """Read a single image slice from .ts

我正在处理以非标准图像格式(.Tsm)存储的大型图像数据集。本质上,它是一个二进制文件,开头有一些头,与FITS标准非常相似,只是存储在little-endian中,而不是FITS-big-endian中

在读取文件头并格式化元数据之后,我可以使用以下代码读取单个图像

    def __read_slice(self, file, img_num, dimensions):
        """Read a single image slice from .tsm file"""

        pixel_range = self.metadata["pixel range"]
        bytes_to_read = self.metadata["bytes to read"]

        # position file pointer to correct byte
        file.seek(self.HEADER_TOTAL_LEN + (bytes_to_read * img_num), 0)

        all_bytes = file.read(bytes_to_read)  # read image bytes
        img = np.empty(len(pixels), dtype='uint16')  # preallocate image vector

        byte_idx = 0
        for idx, pixel in enumerate(pixel_range):
            img[idx] = (all_bytes[byte_idx + 1] << 8) + all_bytes[byte_idx]
            byte_idx += 2

        return np.reshape(img, (dimensions[1], dimensions[0]))  # reshape array to correct dimensions 
def\uu读取切片(self、file、img\u num、dimensions):
“”“从.tsm文件读取单个图像切片”“”
像素范围=自身元数据[“像素范围”]
bytes_to_read=self.metadata[“bytes to read”]
#将文件指针定位到正确的字节
seek(self.HEADER\u TOTAL\u LEN+(字节到读取*img\u num),0)
all_bytes=file.read(bytes_to_read)#读取图像字节
img=np.empty(len(像素),dtype='uint16')#预分配图像向量
字节_idx=0
对于idx,枚举中的像素(像素范围):
img[idx]=(所有字节[byte\u idx+1]您可以尝试:

img= np.frombuffer(all_bytes, dtype='uint16')
例如:

>>> np.frombuffer(b'\x01\x02\x03\x04', dtype='uint16')
array([ 513, 1027], dtype=uint16)
您可以尝试:

img= np.frombuffer(all_bytes, dtype='uint16')
例如:

>>> np.frombuffer(b'\x01\x02\x03\x04', dtype='uint16')
array([ 513, 1027], dtype=uint16)

哇,那太快了,谢谢!我显然有很多关于缓冲输入的知识要学习。一般来说,有没有一个有用的来源,任何人都知道,可以了解更多关于隐藏的内容?我假设这种类型的操作在最低级别将由某种for循环处理,无论如何,您必须阅读文档Python通常以代码的正确性和表达性为目标,而不是以效率为目标,这就是为什么需要大量CPU时间的大量计算被转移到本机库(用C、Fortran和其他语言编写)的原因将高级概念留给Python。哇,那太快了,谢谢!我显然有很多关于缓冲输入的知识要学习。一般来说,有没有一个有用的来源,任何人都知道,可以了解更多关于隐藏的内容?我假设这种最低级的操作将由某种for循环处理我必须阅读您打算使用的任何库的文档。Python通常以代码的正确性和表达性为目标,而不是效率,这就是为什么需要大量CPU时间的大量计算被卸载到本机库(用C、Fortran和其他语言编写)中,而将高级概念留给Python的原因。