2017-04-20 62 views
0

我想爲一個給定矩陣點建立一個3x3塊,並在該塊的中心點。這是我的代碼:如何提取所有鄰居?

function frmBlock = fetchNeighbors(frame, row, column) 
%Create a 3x3 matrix contains the neighbors of the point(x, y) 
%[n, m] = size(frame); 
frmBlock = zeros(3, 3); 
x = floor(row); 
y = floor(column); 
    frmBlock(1) = frame(x-1, y-1); 
    frmBlock(2) = frame(x, y-1); 
    frmBlock(3) = frame(x+1, y+1); 
    frmBlock(4) = frame(x-1, y); 
    frmBlock(5) = frame(x, y); 
    frmBlock(6) = frame(x+1, y); 
    frmBlock(7) = frame(x-1, y+1); 
    frmBlock(8) = frame(x, y+1); 
    frmBlock(9) = frame(x+1, y-1); 
end 

正如你所看到的,我創建0.初始化的3x3矩陣我想要做的就是爲了填補矩陣座標所有鄰居輸入(行,列) 。如果由於某種原因我無法得到鄰居,我什麼也不做(即讓3x3塊中的那個位置爲0)。

當我運行此代碼,我得到了一個錯誤說:

Error using fetchNeighbors (line 12) Index exceeds matrix dimensions.

有人能幫忙嗎?

+0

如果你有RGB格式的彩色圖像,你需要'frmBlock = nan(3,3,3)'。第三維是RBG向量。 'frmBlock(1,1,:)= frame(x-1,y-1,:)'應該爲一個像素做訣竅。 – Crowley

+0

不,我沒有彩色圖像。 – SenDjasni

+0

我更新我的問題。 – SenDjasni

回答

3

我猜的錯誤是由於你正在服用rowcolumn要對矩陣frame的邊界,然後當您嘗試訪問元素恰到好處或左或低於或高於這個事實(取決於你在哪個邊界),你超出了界限,這就產生了錯誤。例如,如果row等於1,這意味着在某些時候您嘗試訪問frame(0,column),這是非法的。

您可以通過在對矩陣進行任何訪問之前添加支票(使用if語句)來解決此問題,以確保您處於邊界之內。我在這裏添加一個替代方法:

function frmBlock = fetchNeighbors(frame, row, column) 
% Create a 3x3 matrix that contains the neighbors of the point (row,column) 
    [n,m] = size(frame); 
    neighbors_x = max(row-1,1):min(row+1,n); 
    neighbors_y = max(column-1,1):min(column+1,m); 
    frmBlock = zeros(3,3); 
    frmBlock(neighbors_x-row+2,neighbors_y-column+2) = frame(neighbors_x,neighbors_y); 
end 
+0

感謝您的回答,它的工作,只是最後一件事情,如果我可以,輸入(行,列)不是整數,他們是真實的,所以對他們使用'round()'函數,但我得到這個錯誤: '索引操作無效' – SenDjasni

+0

在非整數索引中訪問矩陣無效。如果你確定四捨五入整數,你不應該得到這個錯誤。如果你這樣做,我建議你重新檢查你的代碼,如果問題仍然存在,打開一個新的StackOverflow問題來解決這個問題。您可以在評論中添加問題鏈接。 – Lior

+0

再次感謝@Lior。 – SenDjasni