2013-01-22 55 views
0

我在Octave中實現了這個算法,根據輸入矩陣(c),輸出矩陣(o)是預期的,但是在imshow()中顯示的輸出與輸入圖像不相似。實現最近鄰調整大小的扭曲結果圖像Octave

你能幫我指出這有什麼問題嗎?

我使用的是在Ubuntu 12.10上運行的GNU Octave 3.6.2。

在下面的實施例中的圖像進行2

源圖像尺寸調整2:

輸出圖像

源矩陣

ans(:,:,1) = 

    237 255 34 
    237 255 34 
    255 255 255 
    255 255 255 
    0 255 0 
    0 255 0 

ans(:,:,2) = 

    28 242 177 
    28 242 177 
    242 242 242 
    242 242 242 
    162 242 0 
    162 242 0 

ans(:,:,3) = 

    36 0 76 
    36 0 76 
    0 0 0 
    0 0 0 
    232 0 0 
    232 0 0 

輸出矩陣

ans(:,:,1) = 

    237 237 255 255 34 34 
    237 237 255 255 34 34 
    237 237 255 255 34 34 
    237 237 255 255 34 34 
    255 255 255 255 255 255 
    255 255 255 255 255 255 
    255 255 255 255 255 255 
    255 255 255 255 255 255 
    0  0 255 255  0  0 
    0  0 255 255  0  0 
    0  0 255 255  0  0 
    0  0 255 255  0  0 

ans(:,:,2) = 

    28 28 242 242 177 177 
    28 28 242 242 177 177 
    28 28 242 242 177 177 
    28 28 242 242 177 177 
    242 242 242 242 242 242 
    242 242 242 242 242 242 
    242 242 242 242 242 242 
    242 242 242 242 242 242 
    162 162 242 242  0  0 
    162 162 242 242  0  0 
    162 162 242 242  0  0 
    162 162 242 242  0  0 

ans(:,:,3) = 

    36 36  0  0 76 76 
    36 36  0  0 76 76 
    36 36  0  0 76 76 
    36 36  0  0 76 76 
    0  0  0  0  0  0 
    0  0  0  0  0  0 
    0  0  0  0  0  0 
    0  0  0  0  0  0 
    232 232  0  0  0  0 
    232 232  0  0  0  0 
    232 232  0  0  0  0 
    232 232  0  0  0  0 

的源代碼

function out_img = nneig(in_img, x_scale, y_scale); 

    in_img_height = size(in_img, 1); 
    in_img_width = size(in_img, 2); 
    in_img_channels = size(in_img, 3); 

    out_img_height = round(in_img_height * y_scale); 
    out_img_width = round(in_img_width * x_scale); 
    out_img_channels = in_img_channels; 

    out_img = zeros(out_img_height, out_img_width, out_img_channels); 

    tf_mtx = zeros(3, 3); 
    tf_mtx(1, 1) = 1/x_scale; 
    tf_mtx(2, 2) = 1/y_scale; 
    tf_mtx(3, 3) = 1; 

    for out_channel = 1:out_img_channels 
     for out_line = 1:out_img_height 
      for out_col = 1:out_img_width 
       org_coord_mtx = floor(tf_mtx * [out_col - 1; out_line - 1; 1]) + [1; 1; 0]; 
        org_coord_line = org_coord_mtx(2, 1); 
        org_coord_col = org_coord_mtx(1, 1); 
       out_img(out_line, out_col, out_channel) = in_img(org_coord_line, org_coord_col, out_channel); 
      end 
     end 
    end 

endfunction 

回答

1

的問題是在類的形象。由於您使用zeros創建了它,因此它將具有雙倍的類別。它應該是uint8。您可以通過使用zeros (x, y, z, "uint8")或最後轉換類來完成。但更好的選擇是使用imresize(),它已經爲你做了這個想法(你可能需要循環通過RGB通道,但我不確定)。

關於你的代碼,你應該避免這些循環。當你有可能更大的實際圖像時,它會真正打擊你的表現。下面的代碼應該工作,只要比例因子是整數好得多:

function b = nearestresize (a, row_scale, col_scale) 
    row_idx = (1:rows (a))(ones (1, row_scale), :); 
    col_idx = (1:columns (a))(ones (col_scale, 1), :); 
    b = a(row_idx, col_idx, :); 
endfunction 

無論如何,你應該使用imresize從圖像包「最近」的方法(我不知道它有多好作品與RGB圖像):

b = imresize (im, [rows cols], "nearest") 

imresize代碼,看看它是如何工作(我上面貼的代碼實際上是從它的開發版本)。 Basicall; y最後歸結爲使用「最近」方法的interp2()

+0

將輸出矩陣轉換爲uint8,並按預期工作!我知道imresize和interp,但我想這樣做是爲了學術目的。非常感謝! :D對不起,我無法贊成你,因爲我沒有足夠的聲望。 – marcioggs

+1

@marcioggs現在你已經寫了它,至少看看'interp2()'看看它是如何做到的。這就是Octave的美妙之處,你可以自由地看到事情是如何完成的。 – carandraug