如何替换符合距离标准的像素?

时间:2017-02-28 03:37:49

标签: arrays matlab image-processing

我有图片:

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的像素,我希望将‘A’中的两个位置替换为NaN,否则,我会将它们保留原样。

我的预期输出是:

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

请非常感谢任何帮助。非常感谢!

1 个答案:

答案 0 :(得分: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