1.原始MSTAR转换工具的使用
参考链接:
(1) MSTAR数据集下载地址及处理方法:
https://blog.csdn.net/qq_34277608/article/details/87884021
(2)工具箱readme文件
mstar_conv_tools\mstar2jpeg
2. Ubantu使用
2.1 常见问题解决
ubantu系统下报错:
#include “/usr/include/jpeglib.h”
解决方法1:
sudo apt-get install libjpeg-dev
解决方法2:(可以解决后续问题)
1 :configure: error: jpeglib.h not found. 解决如下: 在终端依次输入
rpm -qa | grep libjpeg
yum -y install libjpeg-devel
yum list installed | grep libjpeg
rpm -ql libjpeg-turbo
再次编译即可
2.2 结果展示
官方数据库给的结果
128*128,3.56 KB (3,650 字节)
./mstar2jpeg -i HB03333.003 -o HB03333-1.jpg
./mstar2jpeg -i HB03333.003 -o HB03333-2-1.jpg [-e]
./mstar2jpeg -i HB03333.003 -o HB03333-2-1.jpg -e
4.97 KB (5,092 字节)
./mstar2jpeg -i HB03333.003 -o HB03333-3-1.jpg -e -q 95
10.4 KB (10,735 字节)
./mstar2jpeg -i HB03333.003 -o HB03333-3-2.jpg -e -q 5
765 字节 (765 字节)
./mstar2jpeg -i HB03333.003 -o HB03333-3-3.jpg -q 95
./mstar2jpeg -i HB03333.003 -o HB03333-4-1.jpg -e -h
会产生头文件说明,其他无不同。
./mstar2jpeg -i HB03333.003 -o HB03333-5.jpg -e -v
会产生以下提示说明,其他无不同
MSTAR to JPEG conversion: started!
Determining input image/hdr information...
==> MSTAR target chip image detected...
==> Little-Endian CPU detected: Will byteswap before scaling data!
Reading MSTAR Chip magnitude data...
Performing auto-byteswap...
Scaling MSTAR Chip magnitude data to 8-bit...
Contrast-Adjusting 8-bit data..
Setting up JPEG parameters....1
3.Matlab 复原
Maltab代码是当时合作的大佬同学基于linux代码重构的,基本逻辑比较简单,但是这里公开让大家欣赏一下。
% 这个程序可以把MSTAR车辆目标文件转为jpg,但是大场景图像数据格式不同,要稍微改一改
% MSTAR车辆目标文件前1606字节是头文件信息,记录了文件名、图像长宽等数据
% 后面131072=128*128*4*2字节是幅度+相位信息(所以*2),对应128*128个像素,每个像素值为占据4个字节的浮点数
function mstar2jpg()
clc;clear;
f3 = fopen('HB03333.003','r'); % 以只读方式打开二进制文件HB03333.003
answer3 = fread(f3); % 数据读入answer3
answer4 = answer3( 1607:132678 ); % 前1606字节是文件头,我们不需要 1607 + 131072
fid = fopen('临时文件HB03333.003', 'wb'); % 将出文件头外的所有数据写入临时文件HB03333.003
fwrite(fid, answer4);
f = fopen('临时文件HB03333.003', 'r'); % 以只读方式打开二进制文件 '临时文件HB03333.004'
amplitude = fread(f,[128*128,1], '*float', 'ieee-be.l64');% 数据读入amplitude
% HB03333.004一共131072字节,每4个字节表示一个浮点数(float)
% 所以一共有32768=128*128*2个浮点数,其中前128*128个浮点数表示幅度,后128*128个表示相位
% 这里只读取幅度信息,所以amplitude为(128*128,1)的向量
fclose(f3);fclose(f);
% 下面是幅度值转灰度值的线性变换,最大幅度对应灰度值255,最小幅度对应灰度值0
max_pixel = max(amplitude); % 图像中最大的幅度值
min_pixel = min(amplitude); % 图像中最小的幅度值
pixel_range = max_pixel - min_pixel;
pixel_scale = 255.0 / pixel_range; % 变换比例
amplitude1=amplitude;amplitude2=amplitude;amplitude3=amplitude;
for i = 1 : 128*128
amplitude1(i) = amplitude(i) - min_pixel;
amplitude2(i) = amplitude1(i) * pixel_scale;
amplitude3(i) = round(amplitude2(i)+0.5);
end
pic = amplitude3;
I = reshape( pic, 128, 128 ); % 向量转矩阵
I = mat2gray( I'); % 矩阵转灰度图
imwrite(I, 'HB03333.jpg');
figure('name','灰度增强前的图像'); imshow(I)%显示图像
enhanced_img = enhancement(pic);%灰度增强
enI = reshape(enhanced_img, 128, 128);%向量转矩阵
enI = mat2gray(enI');%矩阵转灰度图
imwrite(enI, 'enHB03333.jpg');
figure('name','灰度增强后的图像'); imshow(enI)%显示灰度增强后的图像
end
%灰度增强函数
function enhanced_img = enhancement(img)
% 统计图像中出现次数最多和最少的灰度值(max_count和min_count)
% 如果min_count>max_count
% 灰度 = 原灰度 * 255 /(min_count - max_count)
% 否则
% 灰度 = 原灰度*3
% 大于255的灰度记为255
pixel_count = zeros(256,1);
for i=1:255
pixel_count(i) = sum(img==i);%统计图像中灰度i出现的次数
end
[~,max_count] = max(pixel_count); % 灰度i出现的次数最大值的下标,即此时的i
[~,min_count] = min(pixel_count); % 灰度i出现的次数最小值的下标,即此时的i
if min_count > max_count
threshVal = min_count - max_count;
img = 255.0 /threshVal*img; % 灰度 = 原灰度 * 255/threshVal
else
img = 3*img; % 灰度 = 原灰度 * 3
end
img(img > 255) = 255; % 大于255的灰度记为255
img(img < 255) = img(img < 255) + 0.5;
enhanced_img = round(img);
end
|