1. 程式人生 > >MSTAR 資料轉格式

MSTAR 資料轉格式

MSTAR是陸地目標的雷達影象資料集,但給出的檔案是二進位制格式的檔案,在下載資料集是說明中給了一個地址可以下載到轉換工具(https://www.sdms.afrl.af.mil,需翻牆),我用的不是很明白。

README中對MSTAR資料格式說明如下:



FILE FORMAT


Each file is constructed with a prepended, variable-length, 

Phoenix formatted (ASCII) header which contains detailed ground 

truth and sensor information for the specific chip.  Following 

the Phoenix header is the data block.  The data block is written 

in Sun floating point format and is divided into two blocks, a 

magnitude block followed by a phase block.



用記事本任意開啟一個檔案可以看到檔案的PhoenixHeader,中間我們需要的資訊是NumberOfColumns和NumberOfRows這兩個變數,PhoenixHeader以單獨一行“[EndofPhoenixHeader]”結束,後面跟的是模值塊與相位塊(SAR影象是一個復矩陣),我們需要提取模值塊並儲存為圖片。

下面是程式碼:


  
  1. clear
  2. ReadPath = 'D:\Document\Graduation Project\MSTAR\DAA7B02AA\TARGETS\TEST\15_DEG\T72\SN_S7\';
  3. SavePath = 'D:\Document\Graduation Project\MSTAR\DAA7B02AA\TARGETSJPG\TEST\15_DEG\T72\SN_S7\';
  4. FileType = '*.017';
  5. Files = dir([ReadPath FileType]);
  6. NumberOfFiles = length(Files);
  7. for i = 1
    : NumberOfFiles
  8. FileName = Files(i).name;
  9. NameLength = length(FileName);
  10. FID = fopen([ReadPath FileName], 'rb','ieee-be');
  11. ImgColumns = 0;
  12. ImgRows = 0;
  13. while ~feof(FID) % 在PhoenixHeader找到圖片尺寸大小
  14. Text = fgetl(FID);
  15. if ~isempty(strfind( Text, 'NumberOfColumns'))
  16. ImgColumns = str2double( Text( 18: end));
  17. Text = fgetl(FID);
  18. ImgRows = str2double( Text( 15: end));
  19. break;
  20. end
  21. end
  22. while ~feof(FID) % 跳過PhoenixHeader
  23. Text = fgetl(FID);
  24. if ~isempty(strfind( Text, '[EndofPhoenixHeader]'))
  25. break
  26. end
  27. end
  28. Mag = fread(FID,ImgColumns*ImgRows, 'float32','ieee-be');
  29. Img = reshape(Mag,[ImgColumns ImgRows]);
  30. imwrite(uint8(imadjust(Img)* 255),[SavePath FileName( 1:NameLength -3) 'jpg']); % 調整對比度後儲存
  31. fclose(FID);
  32. end



更新一下


最近又用到了這個小指令碼,不過要自己建資料夾挺麻煩的,把它改了一下,寫成了函式形式。當目標資料夾不存在時可以自動建立目標資料夾,並且支援遞迴建立子資料夾並將生成檔案儲存至對應的子資料夾。

以下是程式碼:


  
  1. function MSTAR2JPG(sourcePath, targetPath)
  2. if ~ exist (targetPath,'dir')
  3. mkdir (targetPath) ;
  4. end
  5. Files = dir(sourcePath);
  6. for i = 1:length(Files)
  7. if Files(i).isdir == 0
  8. FID = fopen([sourcePath '\' Files(i). name], 'rb', 'ieee-be');
  9. while ~feof(FID) % 在PhoenixHeader找到圖片尺寸大小
  10. Text = fgetl(FID);
  11. if ~isempty(strfind(Text, 'NumberOfColumns'))
  12. ImgColumns = str2double(Text( 18: end));
  13. Text = fgetl(FID);
  14. ImgRows = str2double(Text( 15: end));
  15. break;
  16. end
  17. end
  18. while ~feof(FID) % 跳過PhoenixHeader
  19. Text = fgetl(FID);
  20. if ~isempty(strfind(Text, '[EndofPhoenixHeader]'))
  21. break
  22. end
  23. end
  24. Mag = fread(FID,ImgColumns*ImgRows, 'float32', 'ieee-be');
  25. Img = reshape(Mag,[ImgColumns ImgRows]);
  26. imwrite(uint8(imadjust(Img)* 255),[targetPath '\' Files(i). name( 1: end- 3) 'JPG']); % 調整對比度後儲存
  27. clear ImgColumns ImgRows
  28. fclose(FID);
  29. else
  30. if strcmp(Files(i). name, '.') ~= 1 && strcmp(Files(i). name, '..') ~= 1
  31. if ~exist([targetPath '\' Files(i). name], 'dir')
  32. mkdir([targetPath '\' Files(i). name]);
  33. end
  34. MSTAR2JPG([sourcePath '\' Files(i). name],[targetPath '\' Files(i). name]);
  35. end
  36. end
  37. end
  38. end