距离单点的距离

时间:2016-12-14 16:45:46

标签: image matlab matrix euclidean-distance

我希望从一个点[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点。

有一种简单的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:3)

由于您的最终目标与图像处理有关,因此我假设您拥有图像处理工具箱。您也可以使用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

答案 1 :(得分:2)

您可以使用pdist2来做到这一点,但是您必须获取网格坐标,计算距离然后将其重新排列回矩阵,所以我只是直接计算距离:< / p>

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