MSTAR二进制数据转numpy矩阵

该文提供了从二进制数据文件转换为numpy矩阵的Python代码,特别是针对MSTAR数据,包括提取幅值和相位信息。首先,代码清理文件夹,删除非二进制文件,然后读取二进制文件头信息获取矩阵尺寸,最后将二进制数据转化为numpy数组并显示为图像。
摘要由CSDN通过智能技术生成

MSTAR二进制数据转numpy矩阵(提取幅值和相位)

数据网站

链接: SDMS PUBLIC DOWNLOAD OPTIONS.

图片:

下载完成后,将其中目标数据文件重新组织,全部放到同一个文件夹下。
在这里插入图片描述
整理每个文件夹下的文件,只保留二进制数据文件
文件整理的python代码如下(分段运行):

import os
from pathlib import Path


# 目标文件夹路径
dst_dir = Path(r"D:\code\data\MSTAR_org\AAA")

##########################################################
# 遍历目标文件夹下的所有文件夹
# for folder in dst_dir.glob("*"):
#     # 如果是文件夹而不是文件
#     if folder.is_dir():
#         # 如果文件夹为空
#         if not os.listdir(folder):
#             # 返回空文件夹名称
#             print(folder.name)

##########################################################
# 存储后缀种类的集合
# extensions = set()
# # 递归函数,遍历目标文件夹下的所有文件夹和文件
# def traverse_folder(folder):
#     for file in folder.glob("*"):
#         # 如果是文件夹而不是文件
#         if file.is_dir():
#             traverse_folder(file)
#         # 如果是文件而不是文件夹
#         elif file.is_file():
#             # 获取文件后缀
#             extension = os.path.splitext(file.name)[1]
#             # 将后缀添加到集合中
#             extensions.add(extension)

# traverse_folder(dst_dir)
# # 打印所有后缀种类
# print(extensions)


##########################################################
# 删除文件夹下以及子文件夹下所有文件中,指定后缀种类的文件
# extensions_to_delete = {".HTM", ".JPG"}

# def traverse_folder(folder):
#     for file in folder.glob("*"):
#         # 如果是文件夹而不是文件
#         if file.is_dir():
#             traverse_folder(file)
#         # 如果是文件而不是文件夹
#         elif file.is_file():
#             # 获取文件后缀
#             extension = os.path.splitext(file.name)[1]
#             # 如果文件后缀在指定的后缀种类中
#             if extension in extensions_to_delete:
#                 # 删除文件
#                 os.remove(file)

# traverse_folder(dst_dir)

##########################################################
# 查询文件夹下以及子文件夹下,同一文件夹中所有文件后缀是否一致,若后缀不一致,或者存在没有后缀的文件,则打印当前文件夹位置
# def traverse_folder(folder):
#     # 存储当前文件夹中的后缀种类
#     extensions = set()
#     # 遍历当前文件夹下的所有文件
#     for file in folder.glob("*"):
#         # 如果是文件夹而不是文件
#         if file.is_dir():
#             # 递归遍历子文件夹
#             traverse_folder(file)
#         # 如果是文件而不是文件夹
#         elif file.is_file():
#             # 获取文件后缀
#             extension = os.path.splitext(file.name)[1]
#             # 如果文件没有后缀
#             if not extension:
#                 # 打印当前文件夹位置
#                 print(f"Folder {folder} contains file {file} with no extension.")
#                 return
#             # 将后缀添加到集合中
#             extensions.add(extension)
#     # 如果当前文件夹中的后缀种类不止一种
#     if len(extensions) > 1:
#         # 打印当前文件夹位置
#         print(f"Folder {folder} contains files with different extensions: {extensions}")
#         return

# traverse_folder(dst_dir)

每个文件夹下是同一个目标、同一成像条件下的所有二进制文件
在这里插入图片描述

二进制转numpy的python代码

二进制数据转换为numpy数组代码如下:

import re
from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np


def match_to_float(str_tem):
    # 匹配浮点数或整数并转换为浮点数
    num_str = re.search(r"[-+]?\d*\.\d+|\d+", str_tem).group(0)
    num_float = float(num_str)
    return num_float


def match_str_fun(str_input):
    # 匹配字符串
    str_tem = re.search(r"=.*?\\n", str_input).group(0)[1:-2]
    # 去掉头尾空格
    str_out = str_tem.strip()
    return str_out


# test
# print(match_str_fun("TargetType=  VEHICLE\\n"))
# print(match_to_float("TargetAz=338.224854"))
# print(match_to_float("TargetAz=338"))


def read_file(file_path):
    # 读取文件头部信息
    with open(file_path, "rb") as f:
        header = f.read()
    header_str = str(header)

    # 获取NumberOfColumns
    match_str = re.search(r"NumberOfColumns=.*?\\n", header_str).group(0)
    num_col = int(match_to_float(match_str))

    # 获取NumberOfRows
    match_str = re.search(r"NumberOfRows=.*?\\n", header_str).group(0)
    num_row = int(match_to_float(match_str))

    # 获取DesiredDepression
    match_str = re.search(r"DesiredDepression=.*?\\n", header_str).group(0)
    DesiredDepression = match_to_float(match_str)

    # 获取TargetAz
    match_str = re.search(r"TargetAz=.*?\\n", header_str).group(0)
    TargetAz = match_to_float(match_str)

    # 获取TargetType
    match_str = re.search(r"TargetType=.*?\\n", header_str).group(0)
    TargetType = match_str_fun(match_str)

    # 获取TargetSerNum
    match_str = re.search(r"TargetSerNum=.*?\\n", header_str).group(0)
    TargetSerNum = match_str_fun(match_str)

    # 获取头信息的长度
    match_str = re.search(r"PhoenixHeaderLength=.*?\\n", header_str).group(0)
    num_head = int(match_to_float(match_str))

    print(
        "NumberOfColumns: ",
        num_col,
        "\nNumberOfRows: ",
        num_row,
        "\nDesiredDepression: ",
        DesiredDepression,
        "\nTargetAz: ",
        TargetAz,
        "\nTargetType: ",
        TargetType,
        "\nTargetSerNum: ",
        TargetSerNum,
        "\nPhoenixHeaderLength: ",
        num_head,
    )

    dt = np.dtype(">f4")  # 指定类型为大端序,32位浮点型

    abs_matrix = np.frombuffer(header, dtype=dt, count=num_col * num_row, offset=num_head).reshape((num_row, num_col))
    imag_matrix = np.frombuffer(
        header, dtype=dt, count=num_col * num_row, offset=num_head + num_col * num_row * 4
    ).reshape((num_row, num_col))

    # with open(file_path, "rb") as f:
    #     abs_matrix2 = np.fromfile(f, dtype=dt, count=num_col * num_row, offset=num_head).reshape((num_row, num_col))
    #     imag_matrix2 = np.fromfile(f, dtype=dt, count=num_col * num_row, offset=0).reshape((num_row, num_col))
    # print(np.allclose(abs_matrix, abs_matrix2))
    # print(np.allclose(imag_matrix, imag_matrix2))

    plt.subplot(121), plt.imshow(abs_matrix, vmin=0, vmax=1), plt.colorbar()
    plt.subplot(122), plt.imshow(imag_matrix), plt.colorbar()
    plt.show()


read_file(r"D:\code\data\MSTAR_org\AAA\2S1_deg15\HB14931.000")

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值