到单点的距离

Distances from a single point

我想从一个点生成欧几里德距离矩阵 [1,1]。这就是我所拥有的,但是它没有按预期工作:

a=rand(10,10);
a=sort(a); %sort example matrix it should be visible that distances should get bigger and bigger
a=pdist([ones(size(a));a]);

请将 10x10 矩阵想象成图像。我想获得从点 A(此处为 [1,1])到一系列其他点(即整个矩阵)的距离。所以预期的格式将是原始矩阵 10x10 大小但具有到点 A 的所有距离。

有没有简单可行的方法?

你可以使用pdist2来做到这一点,但是你必须得到网格坐标,计算距离,然后重新排列成矩阵,所以我直接计算距离:

point = [1 1];   % point to calculate distance from
imgRows = 10;    % grid size
imgCols = 10;

a = sqrt( ([1:imgRows].' -  point(1)).^2 + ([1:imgCols] - point(2)).^2 );

如果您没有使用带有自动广播功能的最新版本的 MATLAB(或 Octave),则需要改用 bsxfun 版本:

a = bsxfun(@(x,y) sqrt(x.^2 + y.^2), ([1:imgRows] - point(1)).', ([1:imgCols] - point(2)));

结果:

a =

    0.00000    1.00000    2.00000    3.00000    4.00000    5.00000    6.00000    7.00000    8.00000    9.00000
    1.00000    1.41421    2.23607    3.16228    4.12311    5.09902    6.08276    7.07107    8.06226    9.05539
    2.00000    2.23607    2.82843    3.60555    4.47214    5.38516    6.32456    7.28011    8.24621    9.21954
    3.00000    3.16228    3.60555    4.24264    5.00000    5.83095    6.70820    7.61577    8.54400    9.48683
    4.00000    4.12311    4.47214    5.00000    5.65685    6.40312    7.21110    8.06226    8.94427    9.84886
    5.00000    5.09902    5.38516    5.83095    6.40312    7.07107    7.81025    8.60233    9.43398   10.29563
    6.00000    6.08276    6.32456    6.70820    7.21110    7.81025    8.48528    9.21954   10.00000   10.81665
    7.00000    7.07107    7.28011    7.61577    8.06226    8.60233    9.21954    9.89949   10.63015   11.40175
    8.00000    8.06226    8.24621    8.54400    8.94427    9.43398   10.00000   10.63015   11.31371   12.04159
    9.00000    9.05539    9.21954    9.48683    9.84886   10.29563   10.81665   11.40175   12.04159   12.72792

由于您的最终目标与图像处理有关,因此我假设您拥有图像处理工具箱。您也可以使用 bwdist 并将输入的左上角设置为 true 并让它填充其余部分。请注意,输入是二值图像。

A = false(10, 10);
A(1, 1) = true;
B = bwdist(A);

bwdist计算distance transform,其中设置输出的每个位置,以便如果对应的输入位置为false,则从该位置到最近的非零值的距离像素进行计算。对于true的位置,输出自然为0。由于左上角的输入中只有一个非零像素,因此图像的其余部分应该计算到该像素的距离。距离的默认方法是欧几里德距离,这就是您所追求的。

另请注意,bwdist 的返回类型为 single,即单精度浮点数。根据您的应用程序,转换为完整的 double 可能是首选,这是默认的 MATLAB 数字数据类型。只需使用 double 函数转换输出即可。

B = double(bwdist(A));

示例运行

>> A = false(10, 10);
>> A(1,1) = true;
>> B = double(bwdist(A))

B =

         0    1.0000    2.0000    3.0000    4.0000    5.0000    6.0000    7.0000    8.0000    9.0000
    1.0000    1.4142    2.2361    3.1623    4.1231    5.0990    6.0828    7.0711    8.0623    9.0554
    2.0000    2.2361    2.8284    3.6056    4.4721    5.3852    6.3246    7.2801    8.2462    9.2195
    3.0000    3.1623    3.6056    4.2426    5.0000    5.8310    6.7082    7.6158    8.5440    9.4868
    4.0000    4.1231    4.4721    5.0000    5.6569    6.4031    7.2111    8.0623    8.9443    9.8489
    5.0000    5.0990    5.3852    5.8310    6.4031    7.0711    7.8102    8.6023    9.4340   10.2956
    6.0000    6.0828    6.3246    6.7082    7.2111    7.8102    8.4853    9.2195   10.0000   10.8167
    7.0000    7.0711    7.2801    7.6158    8.0623    8.6023    9.2195    9.8995   10.6301   11.4018
    8.0000    8.0623    8.2462    8.5440    8.9443    9.4340   10.0000   10.6301   11.3137   12.0416
    9.0000    9.0554    9.2195    9.4868    9.8489   10.2956   10.8167   11.4018   12.0416   12.7279