2014-07-15 90 views
2

這是我的情況:我有一個30x30的圖像,我想要計算每個點(像素)沿着通過圖像中心的直線的漸變的徑向和切線分量(15, 15)和相同的(i,j)點。在matlab中的矢量分解

[dx, dy] = gradient(img); 

for i=1:30 
    for j=1:30 
     pt = [dx(i, j), dy(i,j)]; 
     line = [i-15, j-15]; 
     costh = dot(line, pt)/(norm(line)*norm(pt)); 
     par(i,j) = norm(costh*line); 
     tang(i,j) = norm(sin(acos(costh))*line); 
    end 
end 

這段代碼正確嗎?

+0

你有沒有設法使它工作? –

回答

0

我認爲在你的代碼中存在一個概念錯誤,我試圖用不同的方法得到你的結果,看看它與你的結果是如何比較的。

[dy, dx] = gradient(img); 

我反轉x和y,因爲在Matlab通常的慣例是具有沿一個矩陣而gradient則相反的行中的第一尺寸。

我創建的相同大小的數組作爲img但用含有矢量的角度從圖像的中心到該點的每個像素:

[I,J] = ind2sub(size(img), 1:numel(img)); 
theta=reshape(atan2d(I-ceil(size(img,1)/2), J-ceil(size(img,2)/2)), size(img))+180; 

功能atan2d確保了4個象限得到不同的角度值。
現在x和y分量的投影可以用三角法來獲得:

par=dx.*sind(theta)+dy.*cosd(theta); 
tang=dx.*cosd(theta)+dy.*sind(theta); 

注意使用.*來實現逐點乘,這是Matlab的矩陣計算的一個很大的優點,節省你一個循環。

下面是具有明確定義的輸入圖像(沿着行沒有梯度和沿着列的恆定梯度)的示例:

img=repmat(1:30, [30 1]); 

結果:

subplot(1,2,1) 
imagesc(par) 
subplot(1,2,2) 
imagesc(tang) 
colorbar 

tangential and radial gradients gradient