2012-04-27 50 views
0

我正在嘗試在GNU八度中編寫一個函數,該函數在PGM圖像上執行雙線性插值。結果並不是那麼好:我不斷在圖像上留下不同色調的斜條紋。另外,在插值期間添加的行和列比他們應該更暗。請有人幫我指出問題嗎?由雙線性插值產生的斜條紋

function bilinear(img) 
    data = imread(img); 

    for n = 1 : 2 : (rows(data) - 1) * 2 
     average = average_vector(data(n, 1:end), data(n+1:1:end)); 
     data = [data(1:n, 1:end); average; data(n+1:rows(data), 1:end)]; 
    end 

    for n = 1 : 2 : (columns(data) - 1) * 2 
     average = average_vector(data(1:rows(data), n), data(1:rows(data), n+1)); 
     data = [data(1:rows(data), 1:n) average data(1:rows(data), n+1:end)]; 
    end 

    imwrite(data, strcat("out_bilinear_", img)); 
end 

function res = average_vector(a, b) 
    res = zeros(size(a)); 
    for n = 1 : length(a) 
     res(n) = (a(n) + b(n))/2; 
    end 
end 

這裏的顯示問題的圖像: enter image description here

回答

2

你通過對輸入圖像的行由行(或列逐列)遍歷,但是插入新行(或列)當你去時。我很確定這會使你的索引變得更糟。

我會建議創建一個新的輸出矩陣,而不是修改原來的。這也會更快。

順便說一句,您的average_vector函數可以簡寫爲res = (a + b)/2;

+0

感謝您指出我可以做'(a + b)/ 2'而不需要'average_vector'。問題是冒號而不是逗號:這個'data(n + 1:1:end)'而不是這個'data(n + 1,1:end)'。它現在有效。我知道這不是非常有效,但在這一點上並不重要。 – 2012-04-27 14:33:19