2017-04-20 1 views
0

주어진 중심점에 대해 블록 중심에 해당 점이있는 3x3 블록을 작성하려고합니다. 이건 내 코드입니다 : 당신이 볼 수 있듯이, 나는 내가하고 싶은 것은 입력에 좌표의 모든 이웃과 그 행렬을 채우는 것입니다 0으로 초기화 된 3 × 3 행렬을 작성픽셀 좌표를 주면 이웃을 모두 추출 할 수 있습니까?

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 

(행, 열) . 어떤 이유로 이웃을 얻을 수 없다면 아무 것도하지 않습니다 (즉, 3x3 블록의 위치를 ​​0으로 지정하십시오).

나는 오류를 가지고이 코드는 말을 실행하면 :

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

누군가가 도와 드릴까요?

+0

RGB 형식의 컬러 이미지를 사용하려면'frmBlock = nan (3,3,3)'이 필요합니다. 3 차원은 RBG 벡터입니다. 'frmBlock (1,1, :) = frame (x-1, y-1, :)은 한 픽셀에 대한 트릭을해야한다. – Crowley

+0

아니요 컬러 이미지가 없습니다. – SenDjasni

+0

질문이 업데이트됩니다. – SenDjasni

답변

3

나는 오류가 그냥 오른쪽 또는 왼쪽 또는 위 아래 또는 요소에 액세스하려고 할 때 다음 행렬 frame의 경계에있을 rowcolumn을 복용하고 있다는 사실 때문이다 같은데요 (어느 경계에 있는지에 따라 다름), 범위를 벗어나서 오류가 발생합니다. 예를 들어, row1과 같으면 어떤 시점에서 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

답변을 주셔서 감사합니다, 그게 효과가 마지막 한가지, 입력 (행, 열) 정수가 아니라, 그들은 진짜, 그래서 그들에'라운드()'함수를 사용하지만 난이 오류있어 : '잘못된 인덱싱 작업 ' – SenDjasni

+0

유효하지 않은 정수 인덱스가 아닌 행렬에 액세스 중입니다. 정수를 반올림하면 오류가 발생하지 않아야합니다. 그렇다면 코드를 다시 검사하고 문제가 지속되면 해당 문제를 대상으로하는 새 StackOverflow 질문을 엽니 다. 의견에 대한 링크를 코멘트에 추가 할 수 있습니다. – Lior

+0

@Lior 다시 한번 감사드립니다. – SenDjasni

관련 문제