目录
一. 数据分析
工作中,领导让帮其他同事处理一些数据,协助他们分析一些问题(据说以前有工具,然后数据结构变了,不能用了)数据格式如下所示:

这是扫描一张支票图像保存的二进制数据,其中图像的尺寸大小为(3024*500),保存的二进制数据结构为

- 数据构成我解析成首先是第一列像素点的红色分量的像素值, r1,r2,r3,f1,r4,r5,r6,f1,…….r3022,r3023,r3024,f1(其中f1为标识位,为09(十六进制))
- 然后是第一列像素的绿色分量的像素值,g1,g2,g3,f2,g4,g5,g6,f2,…….g3022,g3023,g3024,f2(其中f2为标识位,为0A(十六进制))
- 接着是第一列像素的蓝色分量的像素值,b1,b2,b3,f3,b4,b5,b6,f3,…….b3022,b3023,b3024,f3(其中f3为标识位,为0B(十六进制))
- 最后是第一列像素的红外扫描的像素值(灰度值),ir1,ir2,ir3,f4,ir4,ir5,ir6,f4,…….ir3022,ir3023,ir3024,f4(其中f4为标识位,为10(十六进制))
其余部分的数据结构依次循环。在一列中每个分量有1008个标识位,所以.bin文件的数据个数为(3024+1008)*500*4
二.方法分析
- 读取.bin文件数据
- 将数据(过滤掉标识位)转化成十进制并且存在一个list中
- 将步骤二中的数据提取成R、G、B、ir分量数据
- 使用numpy+opencv将步骤三中的数据生成BGR图和红外扫描的灰度图
下面附上Python代码
import struct
import os
import cv2 as cv
import numpy as np
if __name__ == '__main__':
filepath='D:\\文件处理\\DPM910_0_transdata.bin'
binfile = open(filepath, 'rb') #打开二进制文件
size = os.path.getsize(filepath) #获得文件大小
# print(size)
Data = []
i = 1
while(i<size+1):
data = binfile.read(1) #每次输出一个字节
# print(data)
num = struct.unpack('B', data)
if(i%4 != 0):
Data.append(num[0]) #每四位是一个标志位,将四的倍数以外的有效数据保存
i = i + 1
# print(len(Data))
R_start = 0
R_end = 3024
G_start = 3024
G_end = 6048
B_start = 6048
B_end = 9072
red_start = 9072
red_end = 12096
R = []
G = []
B = []
ir = []
#提取红色分量的像素值(过滤标识位)
while R_end <= len(Data) - 9072:
for j in Data[R_start:R_end]:
R.append(j)
R_start = R_start + 12096
R_end = R_end + 12096
while G_end <= len(Data) - 6048:
for k in Data[G_start:G_end]:
G.append(k)
G_start = G_start + 12096
G_end = G_end + 12096
while B_end <= len(Data) - 3024:
for m in Data[B_start:B_end]:
B.append(m)
B_start = B_start + 12096
B_end = B_end + 12096
while red_end <= len(Data):
for n in Data[red_start:red_end]:
ir.append(n)
red_start = red_start + 12096
red_end = red_end + 12096
# print(len(R),len(G),len(B),len(ir))
#将list转化为np.array
IR = np.array(ir)
IR = IR.reshape(500, 3024)
# cv.imshow('ir', IR)
cv.imwrite("ir.bmp",IR)
BGR = []
for p in range(len(R)):
BGR.append(B[p])
BGR.append(G[p])
BGR.append(R[p])
# print(len(BGR))
BGR = np.array(BGR)
BGRimage = BGR.reshape(500,3024,3)
cv.imwrite("BGR.bmp", BGRimage)
# cv.waitKey()
binfile.close()
下面给出处理后的图


Python新手,大佬勿喷!
版权声明:本文为qq_24819549原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。