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")