2013-12-19 176 views
1

我是一個非常新的程序員(這是我的第二個練習),並且我被要求通過正弦移位將圖像(銀河系)移位。我試圖寫一個程序要做到這一點,如下所示:matlab中的圖像處理

我的程序:

GalaxyImage = imread('hs-2013-06-a-web.jpg'); 
image(GalaxyImage) 
GalaxyImage=double(GalaxyImage)/255; 
image(Sess2GalaxyIm(GalaxyImage)); 

我的功能:

function [GalaxySlanted] = Sess2GalaxyIm(GalaxyImage) 
    A = 20; 
    k = 3; 
    Y = size(GalaxyImage, 1); 
    X = size(GalaxyImage, 2); 
    max_shift = ceil(A*2); 
    GalaxySlanted = zeros(Y, X+max_shift, 3); 
    for y=1:Y 
     local_shift = ceil(A*sind(k*y)); 
     local_x = 1:X; 
     local_x = local_x + local_shift; 
     GalaxySlanted(y, local_x, :)=GalaxyImage(y, :, :); 
    end 
end 

此刻,當我運行它,它似乎只是我的形象不斷變化,我不明白爲什麼。

+1

你能指定什麼是正弦變換嗎?爲什麼你的代碼不起作用? – Acorbe

+0

@Acorbe這是一個正弦波在x軸上的移動,使圖像變形(y中的直線成爲y中的正弦波)。運行我的代碼後,圖像似乎沒有改變,除了它已全部向右移動,並且黑色矩形現在位於左側。 – user3120143

回答

0

有是如何定義local_x的可能問題。你開始通過添加一些填充到圖像,以補償的事實,輸出x可達到「A」的像素兩邊轉移:

max_shift = ceil(A*2); 
GalaxySlanted = zeros(Y, X+max_shift, 3); 

然而,在循環中,你忽略了這一點,纔開始與local_x關閉爲1:X - 所以如果sind的輸出爲負數,您將嘗試將負數編入GalaxySlanted並得到一個結果錯誤。將該行更改爲local_x = (1:X)+A;應該可以工作(oMiD對班次進行了修改)。

另一個快速提示 - 實際上有一個功能im2double,它將一次處理圖像轉換和縮放。

+0

啊,是的,非常感謝,現在已經修好了。 – user3120143

4

你的形象的轉變是恆定的,因爲在local_shift = ceil(A*sind(k*Y));您使用的常量值的A,K和Y可能是這個修改使你的代碼的正確:(Ÿ代替Ÿ

local_shift = ceil(A*sind(k*y)); 
+0

謝謝,這似乎是一個非常合乎邏輯的改變,我已經把它放進去了,但它似乎沒有改變任何東西。 – user3120143