问题描述:
我的任务是对一个二进制编码的图片文件进行读取并显示,在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()