MATLAB批量儲存影像和顯示演算法處理的影像不留空白

南方菜鳥發表於2021-08-22

一 前言

       最近收到審稿人的修改意見,其中一條為<RC: There were only five images evaluated in the experiment, and I recommend increasing to twenty to further evaluate the algorithm performance.>他說我論文只有五副影像用來評價演算法效能,推薦我至少用20副影像來模擬演算法效果. 但絕大多數SCI論文的實驗部分都是五副紅外影像,三個參考演算法,即每一張紅外影像對應五副不同的結果,那麼5副影像就是25張影像了,這樣下來已經佔了論文的大多數篇幅了.如果增加為20副,那至少得放100張不同結果的影像,估計得佔兩頁紙! 我TM, 真是無語! 都是按照發表的論文寫的,審稿人竟然提出如此要求.....但要畢業只好硬著頭皮搞, 哪怕審稿人讓我摘星星,我也得踮起腳尖向上跳!

 

二 MATLAB如何實現一次列印20副影像

 

(一)下載20副紅外影像

   既然要做二十副紅外影像的演算法實驗,首先得找到二十張紅外影像,那就去網上找紅外影像資料集,一篇部落格如下:https://blog.csdn.net/qq_15698613/article/details/109052006

由於最近也在數字IC找工作,還是推薦一下學習IC基礎知識的部落格;https://blog.csdn.net/mu_guang_/category_10397670.html

重點推薦兩個資料集:用於基於深度學習的紅外目標檢測

1.第一個資料集

   http://csr.bu.edu/BU-TIV/BUTIV.html

2.第二個資料集Thermal Infrared Dataset

https://projects.asl.ethz.ch/datasets/doku.php?id=ir:iricra2014

這些資料集,基本上都是幾百幾千張影像,所以都是1個G或4個G的大小,很可怕!所以我直接開通了百度網盤會員下載,不然4個G下載不了!若是對深度學習的紅外目標檢測感興趣,那就必然下載用於演算法研究!

 

(二) matlab實現對輸入的20副紅外影像演算法處理後輸出

 

   思路是;分成兩步,第一步是把演算法處理後的20副紅外影像放在一個元胞向量中;第二步,輸出顯示每一個演算法的結果影像,並分配一個檔名;

1.第一步演算法處理得到20副紅外影像的輸出結果

把輸入的20副紅外影像賦值給5行4列的元胞陣列,用迴圈實現對元胞陣列中的每一副紅外影像做演算法處理,賦值給一個包含20個元素的元胞向量OUT1,程式碼如下:

 

%this file is used to
%once display the result of Algorithm for 20 images
%pattention:the function can't have a figure
%--subplot(1,1,1);or imshow(test_R2); 
clc;
close all;
clear;
%----a example for display different solution images----
%324*256
I1=imread('../infrared/17sempach_BG1_1.png');
I2=imread('../infrared/18sempach_BG2_1.png');
I3=imread('../infrared/19sempach_BG3_1.png');
I4=imread('../infrared/20sempach_BG4_1.png');
%324*256
%512*512
I5=imread('../infrared/01orange_raw01.png');
I6=imread('../infrared/02orange01_nuc.png');
I7=imread('../infrared/11green_TIV01.png');
I8=imread('../infrared/12red_TIV01.png');
%512*512
%640*512
I9=imread('../infrared/03red_cma01.png');
I10=imread('../infrared/04red_cmb01.png');
I11=imread('../infrared/06cmA_seq01.png');
I12=imread('../infrared/07cmC_seq01.png');

I13=imread('../infrared/08cmA_seq1_01.png');
I14=imread('../infrared/09cmB_seq2_01.png');
I15=imread('../infrared/21FLIR_video_00001.tiff');
I16=imread('../infrared/22FLIR_08863.tiff');
I17=imread('../infrared/23FLIR_thermal1.tiff');
%640*512
%1024*512
I18=imread('../infrared/13raw01.png');
I19=imread('../infrared/14seq3_nuc01.png');
I20=imread('../infrared/15seq4_nuc01.png');
%1024*512
%1024*640
I21=imread('../infrared/16seq5_nuc01.png');
%1024*640
%1024*1024
I22=imread('../infrared/03red_cma01.png');
I23=imread('../infrared/10seq3_raw01.png');
%1024*1024
%----a example for display different solution of images----
%input 20 different images
%Picture save "batch"
I = cell(5,4);
I{1,1}=I1;  I{1,2}=I2; I{1,3}=I3; I{1,4}=I4;
I{2,1}=I5;  I{2,2}=I6; I{2,3}=I7; I{2,4}=I8;
I{3,1}=I9;  I{3,2}=I10;I{3,3}=I11;I{3,4}=I12;
I{4,1}=I13; I{4,2}=I14;I{4,3}=I15;I{4,4}=I16;
I{5,1}=I17; I{5,2}=I18;I{5,3}=I19;I{5,4}=I20;
out1 = cell(1,20);
%Picture save "batch" by method 1
%this method is not recommend
%Not centered
% for i =1:2
%     for j = 1:2
%         temp = I{i,j};
%         out = GABF_DDE_top820(temp);
%         out1{(2*(i-1)+j)} = out;
%          H = figure;
%         subplot(2,2,(2*(i-1)+j));
%         imshow(out);title({num2str(i);num2str(j)});
%         print(H,'-dtiffn','-r600',num2str((2*(i-1)+j)));
%     end
% end
%Picture save "batch" by method 2
%the result is centred
%recommened 
for i =1:5
    for j = 1:4
        temp = I{i,j};
        out = GABF_DDE_top820(temp);
        out1{(4*(i-1)+j)} = out;
%         subplot(5,4,(4*(i-1)+j));
%         imshow(out);title({num2str(i);num2str(j)});
    end
end

 

  2.第二步,為每一個輸出結果分配檔名,且讓影像顯示視窗不留空白

       先用一個元胞向量filename存放20個紅外影像的檔名,然後結合print函式和迴圈結構,給每個結果指定儲存圖片格式如tiff,影像的解析度600PPI('-r600'),檔名filename{k}

其中的一個亮點是,matlab顯示影像不留空白,程式碼僅一行關鍵:set(gca, 'position', [0 0 1 1 ]);axis normal;%the csdn website

matlab程式碼如下:

filename = { 'IMA1', 'IMA2', 'IMA3', 'IMA4'...
             ,'IMA5', 'IMA6', 'IMA7', 'IMA8'...
             ,'IMA9','IMA10','IMA11','IMA12'...
             ,'IMA13','IMA14','IMA15','IMA16'...
             ,'IMA17','IMA18','IMA19','IMA20'};
for k = 1:length(filename)
      H = figure;   % 指定圖片列印figure_handles
       subplot(1,1,1);imshow(out1{k});
       set(gca, 'position', [0 0 1 1 ]);axis normal;%the csdn website
       print(H,'-dtiffn','-r600',filename{k}) ;%internet
%        print(H,'-dtiffn','-r600',num2str(k)) ;%internet
end

  重點是print函式批量輸出不同檔名的影像,matlab顯示影像沒有多餘的空白

三實驗結果展示

 

下面給出,能夠達到預期效果的實驗結果:1.即一次批量輸出20副紅外影像且每一個分配檔名和儲存為600PPI的tiff格式;2.一次輸出顯示20副紅外影像;3.matlab顯示影像沒有多餘空白(為了放在論文好看);

圖1

圖2有多餘的空白的結果影像,如下所示

圖3為填充滿整個視窗的影像結果,如下

給出在同一幅影像顯示兩種效果的實驗圖,如下

 論文要是影像有多餘的空白,如上面Figure2視窗的影像,那麼審稿人會懟你,就是為了湊字數佔篇幅,很尷尬!所以為了讓論文更緊湊,內容足夠,你得讓matlab演算法處理的紅外影像沒有多餘空白,如如上面Figure1視窗影像倩女幽魂2所示,這樣在論文中很美觀。如下所示:第一張無空白在word中,第二張是有空白在word中,還給出了調整影像PPI的四種方法.

 

總結:

 遇到問題,得獨立思考,有更快和高效的辦法,並不需要一切都按部就班做,如昨天搜尋發現,很多重複勞動都可以在matlab中用for迴圈實現,如同時顯示四種演算法的模擬效果,可以把四個演算法封裝成函式,在迴圈中針對輸入的多幅影像,呼叫不同函式處理顯示即可;還有平時的辦公,如在word中插入多幅影像,如300副,並不是需要每次手動查詢影像位置,在word中點插入,然後一次次調整大小,太耗時間勒!我插入二十副,搞了一個晚上!可以用多種指令碼語言實現,如python,VB,巨集命令的指令碼!

指令碼,意味著一勞永逸!

希望下次碰上重複的體力勞動活,能夠想到用指令碼實現,但學習指令碼肯定需要抽額外時間不斷學習!打算學習一下python,然後有李笑來的自學是門手藝,學海無涯!

 

參考文獻:

1.matlab幫助文件主題:儲存圖窗時儘可能減少空白空間

2.https://blog.csdn.net/u011624019/article/details/79267394

 

相關文章