MATLAB批量打印輸出600PPI的圖像且圖像不留空白


一 前言

       最近收到審稿人的修改意見,其中有三條:一條為<RC: There were only five images evaluated in the experiment, and I recommend increasing to twenty to further evaluate the algorithm performance.>他說我論文只有五副圖像用來評價算法性能,推薦我至少用20副圖像來仿真算法效果. 另外一條為《1.2. Quality RC: The manuscript should include graphics with a resolution of no less than 600ppi.》論文中每個圖像(圖片)的分辨率不低於600ppi. 第二條讓論文的每張圖像PPI為600PPI,則是讓圖像更高清,細節很清晰!絕大多數人都是截屏MATLAB圖像,自然很模糊,達不到600PPI的要求,后面給出解決辦法。第三條為ablation experiment,<The manuscript has not shown the ablation experiments.>其實傳統的紅外圖像細節增強,直接用matlab實現算法處理,很多經典的論文,如UM,直方圖,BF&DDE,GF&DDE,LEPF&DDE等都沒有消融實驗.這個一般出現在基於深度學習的目標檢測,如論文<Attention Guided Low-Light Image Enhancement with a Large Scale Low-Light Simulation Dataset>的5.4 Ablation Study.通過閱讀這篇論文,理解消融實驗有三點: 你的算法如果由三個關鍵創新點組成,那么你就分別去掉這三部分得到對應的實驗效果如matlab仿真圖像.第二點就是用客觀指標去評價,如PSNR,SSIM,RMSC.第三點至少五副圖像用於在視覺效果和客觀指標評價.當然以審稿人的嚴謹態度,你至少得搞30副圖像.

但絕大多數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',strcat('../result/',filename{k})) ;%internet
% print(H,'-dtiffn','-r600',num2str(k)) ;%internet end

  重點是print函數批量輸出不同文件名的圖像,matlab顯示圖像沒有多余的空白

3.用print函數和strcat函數輸出圖像到指定位置,且更改圖像PPI為600(常用):

前提是輸入圖像本身要足夠清晰:如果你輸入的截屏圖像很模糊,那么更改為600PPI后圖像依然模糊。一般截屏,圖像分辨率默認為顯示屏的,通常還是壓縮為png,jpeg格式保存!圖像PPI至少600是論文中高質量呈現的重要評價指標,故每次做MATLAB實驗,不要習慣性截屏!得用print函數,不然白搞!strcat函數為連接字符串的函數;常用於批量操作中,將變量與路徑關聯在一起,即把不同的圖像文件存儲在同一個路徑:MATLAB代碼如下

print(H,'-dtiffn','-r600',strcat('../result/',filename{k})) ;%internet

  如上代碼,將圖像輸出到當前目錄的上一級文件名result下,並為每個輸出圖像分配文件名為元胞向量filename里預先設置的文件名,PPI設置為600;

(三) matlab實現mat格式文件轉換為其他格式的圖像(png,jpeg,tiff等)

 mat文件格式是標准的matlab格式,經常會碰到mat格式的圖像,當需要轉換為png,jpeg等格式處理時,就需要把mat格式轉換為png,jpeg格式,方法如下:用到imwrite函數

filename = {'test.png','IMA2.png'};
load('../data/S1.mat');
imwrite(S,strcat('../ablation/',filename{1}));

  注意點:為了推廣到批量處理圖像,代碼思路:用到元胞數組filename, strcat函數,指定輸出圖像到特定的路徑,多張圖像循環調用即可.

顯示圖像有點繞,mat--->png格式,顯示.還有一種直接顯示mat格式圖像的方法,如下:
% %----a example for display 4 images----
I = cell(2);
I{1,1}=load('../data/S1.mat','S');
I{1,2}=load('../data/S2.mat','S');
I{2,1}=load('../data/S3.mat','S');
I{2,2}=load('../data/S4.mat','S');

for i =1:2
    for j = 1:2
        temp_I = I{i,j};
        temp = temp_I.S;
        out = GABF_DDE_top814(temp);
        subplot(2,2,(2*(i-1)+j));
        imshow(out);title({num2str(i);num2str(j)});
    end
end
% %----a example for display 4 images----

  這是在同一個窗口顯示多種處理后的mat格式文件,我們關心的是直接對mat格式圖像做批量處理,如把4張mat格式圖像轉換為png格式圖像,上面給出了思路.下面給出例子,一次把4個mat文件批量輸出為4個png圖像文件,代碼如下:

% %----a example for 4 images----
% convert 4 mat file to 4 png file at a time
%output by patch
filename = { 'S1.png', 'S2.png', 'S3.png'...
             , 'S4.png','S5.png'};
I = cell(1,5);
I{1,1}=load('../data/S1.mat','S');%the first key code
I{1,2}=load('../data/S2.mat','S');
I{1,3}=load('../data/S3.mat','S');
I{1,4}=load('../data/S4.mat','S');
% I{1,5}=load('../data/S11.mat','S11');

for i =1:4
        temp_I = I{i};
        temp = temp_I.S;%the second key code
imwrite(temp,strcat('../ablation/',filename{i}));%the third key code
end
% %----a example for 4 images----

  注意點:mat文件的變量要一樣,為了循環處理,如上面mat格式文件的變量名都為S.不一樣則會報錯,引用不存在的字段' '.上面批量輸出的png格式效果如下圖所示

 

 上面為mat格式,下圖為png格式:

 

 

三實驗結果展示

 

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

圖1

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

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

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

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

 

四  問題

 1.word中插入600PPI的圖像卡死了?

  當圖像的PPI為600時,一張圖像就30M左右,用畫圖打開都轉圈圈,要是100張那就是恐怖的3G左右,搜了下網上說大於512兆word會卡死,既然直接插入圖像行不通(理論上,並未實踐驗證),實際上我插入兩張200M的tiff格式的圖像,word為492M還能打開編輯.總會有解決方法替代,如下:

    MATLAB+Visio(畫圖),剛剛上面提到matlab可以更改圖像PPI到600,而Visio則是保持圖像的高分辨的前提下,所占空間又極小,故直接在word中插入對象Visio則會避免所占空間太大。

  網上搜索的插入高分辨圖像到word方法還有,PPT+PDF+TIFF等,還有PS,感興趣可以去試試。

2.怎么畫出高達600PPI的圖標?

  相信絕大多數人和我一樣,習慣性用excel表格自動生成折線圖,柱狀圖,但這樣生成的表格轉換為圖片時,分辨率較低,不能達到期刊的600PPI.意外發現兩款軟件,是最佳畫表格,matlab和Origin.這兩款軟件門檻高,需要自學多搗鼓下。相信工科生大多數都會matlab,畫圖不成問題。推薦一位matlab大神的博客,用於吸收經驗:

https://baimafujinji.blog.csdn.net/article/details/52735764

還有一位是深度學習的大牛博客,如下:

https://blog.csdn.net/qq_41185868

3.word文檔轉換為無壓縮的高分辨PDF文檔

 前提是:在word中插入600PPI以上的TIFF格式圖像或Visio對象(Visio中插入高分辨的tiff格式圖像,如600PPI的圖像)。若是原圖模糊,再怎么設置PPI或高質量打印,都是徒勞的。

默認word會把圖像壓縮到220PPI,且軟件轉換為PDF分辨率也會下降,導致圖像很不清晰,方法是在word打印時選擇adobe PDF,設置打印機屬性的圖像選項為不壓縮,具體細節參考博客如下

https://www.pianshen.com/article/21831222728/

下面分別展示,將圖像都放大到800%:有壓縮和無壓縮,打印輸出PDF文檔效果,哈哈哈,差別極大,流暢畫質與藍光畫質:

(1)有壓縮的效果如下:

 

 

 (2)高分辨率打印輸出的結果如下:

 

 

 

總結:

 遇到新問題,得獨立思考有幾種解決方法,有更快和高效的辦法,並不需要一切都按部就班做,如昨天搜索發現,很多重復勞動都可以在matlab中用for循環實現,如同時顯示四種算法的仿真效果,可以把四個算法封裝成函數,在循環中針對輸入的多幅圖像,調用不同函數處理顯示即可;還有平時的辦公,如在word中插入多幅圖像,如300副,並不是需要每次手動查找圖像位置,在word中點插入,然后一次次調整大小,太耗時間勒!我插入二十副,搞了一個晚上!可以用多種腳本語言實現,如python,VB,宏命令的腳本!

腳本,意味着一勞永逸!

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

 

參考文獻:

1.matlab幫助文檔主題:保存圖窗時盡可能減少空白空間

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

3. https://www.cnblogs.com/ggg-327931457/p/13423655.html 

4.  https://www.cnblogs.com/CCWangsj/p/13468105.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM