python二进制文件读取问题(大端序和小端序存储转换)

问题描述:

我的任务是对一个二进制编码的图片文件进行读取并显示,在matlab上代码展示如下 :

fid = fopen('20191025181135153.bin','r','ieee-be');
data = fread(fid,[2048 2049],'uint16');
imshow(uint8(data))

然而在python上读取图片时一片漆黑:
最开始的python代码:

import cv2
import numpy as np

imgData = np.fromfile("20191025181135153.bin", dtype=np.uint16,count=-1)
width = 2048
height = 2049

# 注意此处用resize和reshape方法的不同
imgData= np.resize(imgData,(height,width))
print(imgData.shape)
# 注意只能显示uint8类型的数据,如果是uint16的数据请先转成uint8。否则图片显示会出现问题。
img = imgData.astype('uint8')
# 保存图片
cv2.imwrite("something.bmp", img)
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

问题解决

后来发现是图片编码问题,我拿到的图片数据是大端序存储(大端序和小端序存储具体的问题可以百度),matlab读取数据的fopen函数提供了大端序和小端序的参数,然而numpy中的np.fromfile却没有提供(我以为没有提供)。
解决的办法来了!
np.fromfile虽然没有提供大小端序参数,其实却可以在dtype中设置!先看一下dtype类型参数表:
在这里插入图片描述
所以其实可以用字符代码去表示具体的类型,用该方法的好处是可以用><来表示大小端序存储。改进的代码:

imgData = np.fromfile("20191025181135153.bin", dtype='>u2',count=-1)

困扰好久的问题解决!

附完整的numpy读取二进制.bin图像并使用OpenCV展示的代码:

import cv2
import numpy as np

imgData = np.fromfile("20191025181135153.bin", dtype='>u2',count=-1)
width = 2048
height = 2049

# 注意此处用resize和reshape方法的不同
imgData= np.resize(imgData,(height,width))
print(imgData.shape)
# 注意只能显示uint8类型的数据,如果是uint16的数据请先转成uint8。否则图片显示会出现问题。
img = imgData.astype('uint8')
# 保存图片
cv2.imwrite("something.bmp", img)
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值