2017-02-28 29 views
0

我有圖像:如何替換符合距離標準的像素?

A = [3 1 1 2 2 
    0 0 0 3 2 
    0 0 3 3 2 
    1 1 1 1 2 
    1 1 1 2 2]; 

從我得到下列矩陣的圖像:

B = [1,1; 3,3; 2,4; 3,4]; 

現在,我想測試的每個像素之間的距離在'B'看到哪些是大於1與下一行中的直接像素進行比較。對於它們之間的距離爲<= 1的像素,我想用NaN替換‘A’中的兩個位置,否則,我會讓它們保持原樣。

我的預期輸出是:

A = [3 1 1 2 2 
    0 0 0 NaN 2 
    0 0 NaN NaN 2 
    1 1 1 1 2 
    1 1 1 2 2]; 

我曾嘗試下面的代碼,但我不是很明白,究竟我做錯了。

[row, col] = find(A==3); 
B   = [row col] 

for k = size(B, 1)-1 
    if sqrt((row(k,:) - (row(k+1,:)))^.2 + (col(k,:) - (col(k+1,:)))^.2) <= 1 
     A(B(k, :)) = NaN 
    end 
end 

請任何幫助,這是非常感謝。非常感謝!

+0

試'A(B(K,1),B(K,2)) = NaN;'而不是 – Shai

+0

Elementwise power operator是'。^'(而不是'^ .') – m7913d

+0

for循環現在沒有意義,你可能想要的是:'for k = 1:size(B,1)-1' – m7913d

回答

0

如果我正確理解您的問題,您想要將相鄰的3單元更改爲NaN。最簡單的方法是檢查所有3細胞,並檢查其鄰居之一是3,如在下面的代碼來完成:

for k = 1:length(row) 
    if safeCheck(A, row(k)+1, col(k)) || safeCheck(A, row(k), col(k)+1) || ... 
      safeCheck(A, row(k)-1, col(k)) || safeCheck(A, row(k), col(k)-1) 
     A(row(k), col(k)) = NaN; 
    end 
end 

function b = safeCheck(A, row, col) 
    if (1 <= row && row <= size(A, 1) && 1 <= col && col <= size(A, 2)) 
     b = A(row, col) == 3 || isnan(A(row, col)); 
    else 
     b = false; 
    end 
end 
+0

謝謝@ m7913d。代碼起作用。然而,我正在努力將其適應於我的具體問題。這絕不是你的錯,因爲我正在尋找一種以非常簡短的術語來描述問題的好方法。不過,我設計了一個更好的方式來做到這一點,併發布了一個新問題。不要誤解,我也從你的代碼中學到了東西。非常感謝。 – User1772