2014-01-31 58 views
1

我正在使用雙邊過濾器來處理圖像,並且想要在一個「框」中打印通過更改參數產生的過濾圖像。這是我正在運行的腳本,用於調用過濾器並打印圖像,結果非常糟糕,它會打印完整圖像,然後打印出一幅非常小的圖像,您無法說出任何內容。有人能告訴我在子圖/子圖像命令中我做錯了什麼嗎?在matlab中顯示包含子圖和子圖的多個圖像

I = im2double(imread('cat.jpg')); 
sig_d = 1; 
sig_r = 10; 
for i=1:10 
    sig_d = i; 
    for j=1:10 
     sig_r = 10*j; 
     J = bilateral(I,sig_d,sig_r); 
     figure,subplot(10,10,j), subimage(J); 
    end 
end 

我的目標是一個10x10塊,其中的每個圖像是獨特的,不像點。是否有可能完成?

回答

2

1)您正在內循環的每個階段創建多個數字;你只需要(我想)一個數字,所以你需要把命令figure放在你的嵌套循環之外。

2)你到subplot呼叫永遠不會填滿整個陣列

subplot(10,10,j)創建的圖內的10×10陣列的副區,並設定當前軸到數j。因此,如果要用10 x 10圖像陣列填充圖形,則需要按順序調用subplot(10,10,1)subplot(10,10,100)

另一種可能的方式是,如果輸出圖像J的大小始終相同,則預先分配正確大小的單個矩陣並使用montage。例如:

在循環之前,預先分配:

I2 = zeros(n,m,1,100); % n and m are the size of the output image J 

在循環內部,分配輸出到預分配的矩陣

I2(:,:,:,z) = J; % z is your counter from 1 to 100 

之後,顯示蒙太奇

montage(I2,'Size',[10 10]); 

這還具有以下優點你每次計算的時候都不會丟掉你的J - 所以如果y的話你想試驗如何顯示輸出,你可以。

1

首先,刪除對figure的呼叫。這會每次打開一個新窗口。
因爲subplot計算子圖(在本例中爲100)並使用第三個參數來確定要繪製的子圖,所以圖像也將相互覆蓋。你的代碼只能繪製到最上面一行。
要解決這個問題,請使用subplot(10,10,(i-1)*10+j),這會將您的i(本例中的行)考慮在內。如果您想要逐個顯示圖像,請使用subplot(10,10,(j-1)*10+i)

至於圖像的大小,真的沒有太多你可以做的。如果你想在10×10的網格中顯示它們,在一個屏幕上將會有100個圖像,所以它們每個都必須很小。