Python将.bin文件数据分析生成RGB图和灰度图

  • Post author:
  • Post category:python



目录


1. 数据分析


2.方法分析


一. 数据分析

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

十六进制的数据

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

一线(一列)数据的构成

  1. 数据构成我解析成首先是第一列像素点的红色分量的像素值, r1,r2,r3,f1,r4,r5,r6,f1,…….r3022,r3023,r3024,f1(其中f1为标识位,为09(十六进制))
  2. 然后是第一列像素的绿色分量的像素值,g1,g2,g3,f2,g4,g5,g6,f2,…….g3022,g3023,g3024,f2(其中f2为标识位,为0A(十六进制))
  3. 接着是第一列像素的蓝色分量的像素值,b1,b2,b3,f3,b4,b5,b6,f3,…….b3022,b3023,b3024,f3(其中f3为标识位,为0B(十六进制))
  4. 最后是第一列像素的红外扫描的像素值(灰度值),ir1,ir2,ir3,f4,ir4,ir5,ir6,f4,…….ir3022,ir3023,ir3024,f4(其中f4为标识位,为10(十六进制))

其余部分的数据结构依次循环。在一列中每个分量有1008个标识位,所以.bin文件的数据个数为(3024+1008)*500*4

二.方法分析

  1. 读取.bin文件数据
  2. 将数据(过滤掉标识位)转化成十进制并且存在一个list中
  3. 将步骤二中的数据提取成R、G、B、ir分量数据
  4. 使用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()

下面给出处理后的图

BGR图

ir灰度图

Python新手,大佬勿喷!



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