2011-04-19 32 views
0

使用在Matlab im2col滑動窗口我已轉換的輸入圖像塊分割成柱,並再次通過使用col2im i執行逆過程,但輸出不與輸入相同的圖像。我怎樣才能恢復輸入圖像?誰能幫幫我嗎。柱阻止使用滑動窗在MATLAB

下面是代碼

in=imread('tire.tif'); 
[mm nn]=size(in); 
m=8;n=8; 
figure,imshow(in); 
i1=im2col(in,[8 8],'sliding'); 
i2 = reshape(sum(i1),mm-m+1,nn-n+1); 
out=col2im(i2,[m n],[mm nn],'sliding'); 
figure,imshow(out,[]); 

在此先感謝...

回答

0

爲什麼你期待的輸出是一樣的嗎?

i2是圍繞像素鄰域(本質上是低通濾波器)執行SUM的結果,它是您看到的最終模糊圖像。即你不用COL2IM調用進行逆向處理。

3

沒有指定正是的問題是什麼,但我看到一些潛在來源:

  1. 你不應該指望輸出爲正好一樣的輸入,因爲您要用8乘8鄰域中的像素總和替換每個像素值。此外,由於IM2COL'sliding'選項不會爲數組填充邊緣附近像素的鄰域,所以在每個方向上(即[m-1 n-1])會使得到的圖像縮小7像素。

  2. 這兩條線是冗餘:

    i2 = reshape(sum(i1),mm-m+1,nn-n+1); 
    out=col2im(i2,[m n],[mm nn],'sliding'); 
    

    你只需要一個或另一個,而不是兩個:

    %# Use this: 
    out = reshape(sum(i1),mm-m+1,nn-n+1); 
    %# OR this: 
    out = col2im(sum(i1),[m n],[mm nn],'sliding'); 
    
  3. Image data in MATLAB通常'uint8'型的,這意味着每個像素是表示爲跨越範圍0到255的無符號8位整數。假設這是in,當您執行求和操作時,您將最後將其轉換爲'double'(因爲無符號的8位整數可能不足以保存總和)。當圖像像素值用雙重類型表示時,像素值預計會跨越0到1的範圍,因此您需要按照其最大值縮放結果圖像以使其正確顯示:

    out = out./max(out(:)); 
    
  4. 最後,檢查您正在使用什麼樣的輸入圖像。對於您的代碼,基本上假定in是二維(即grayscale intensity image)。如果它是truecolor (i.e. RGB) image,第三個維度會給您帶來一些麻煩,您將不得不分別處理每個色彩平面並重新組合它們或convert the RGB image to grayscale。如果它是一個indexed image(帶有關聯的彩色地圖),則無需先將其轉換爲grayscale representation即可進行上述處理。

+0

感謝您的迴應。問題是將圖像矩陣轉換爲塊後輸出圖像與輸入圖像相同,反之亦然。使用滑動窗口將輸入圖像(灰度強度圖像)轉換成尺寸爲8×8的塊,然後完成反向處理。通過在獨特的窗口技術中使用IM2COL&COL2IM,這是可能的。它可以在滑動窗口技術。 – user714696 2011-04-20 00:17:06

+0

@ user714696:正如我在答覆的第一點中提到的那樣,使用滑動塊選項總會給你一個稍小的結果。原因是因爲沒有使用該技術的填充,並且使用填充是您可以將窗口中心放在邊緣點上的唯一方法。因此,如果您想要得到與輸入圖像大小相同的結果圖像,則需要使用不同的塊選項。 – gnovice 2011-04-20 02:08:21

+0

@ user714696 - 您可以編輯問題以更好地反映您正在查找的內容。如果它的塊處理,看看| blkproc |和| blockproc | (新版本)。 – 2011-04-20 13:05:29

0

i1'sliding'選項獲得了,你會從'distinct'選項獲得,以及你需要過濾掉的信息。現在,這可能不是編碼它的最佳方式,但它可以工作。假設mmm的倍數,nnn的倍數。如果情況並非如此,那麼您必須相應地進行零點填充以實現此目的。

in=imread('tire.tif'); 
[mm nn]=size(in);   
m=8;n=8; 
i1 = im2col(in,[m,n],'sliding'); 

inSel = []; 
for k=0:mm/m-1 
inSel = [inSel 1:n:nn+(nn-n+1)*n*k]; 
end 
out = col2im(i1(:,inSel),[m,n],[mm,nn],'distinct');