Image 距单点的距离

Image 距单点的距离,image,matlab,matrix,euclidean-distance,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])到一系列其他点的距离,即整个矩阵。因此,预期的格式将是原始矩

我想从一个点
[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

您可以使用
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

因为您的最终目标与图像处理相关,所以我假设您拥有图像处理工具箱。您还可以使用并将输入的左上角设置为
true
,然后让它填充其余部分。请注意,输入是一个二进制图像

A = false(10, 10);
A(1, 1) = true;
B = bwdist(A);
bwdist
计算设置输出的每个位置的位置,以便在相应的输入位置为
false
时,计算从该位置到最近的非零像素的距离。对于
true
的位置,输出自然为0。由于左上角的输入中只有一个非零像素,因此图像的其余部分应计算到该像素的距离。默认的距离计算方法是欧几里德距离,这是您所追求的

还请注意,
bwdist
的返回类型是
single
,或单精度浮点。根据您的应用程序,可能会首选转换为默认的MATLAB数值数据类型full
double
。只需使用
double
函数转换输出

B = double(bwdist(A));
示例运行
因为您的最终目标与图像处理相关,所以我假设您拥有图像处理工具箱。您还可以使用并将输入的左上角设置为
true
,然后让它填充其余部分。请注意,输入是一个二进制图像

A = false(10, 10);
A(1, 1) = true;
B = bwdist(A);
bwdist
计算设置输出的每个位置的位置,以便在相应的输入位置为
false
时,计算从该位置到最近的非零像素的距离。对于
true
的位置,输出自然为0。由于左上角的输入中只有一个非零像素,因此图像的其余部分应计算到该像素的距离。默认的距离计算方法是欧几里德距离,这是您所追求的

还请注意,
bwdist
的返回类型是
single
,或单精度浮点。根据您的应用程序,可能会首选转换为默认的MATLAB数值数据类型full
double
。只需使用
double
函数转换输出

B = double(bwdist(A));
示例运行

那么你打算如何计算一个10维的点和一个2维的点之间的距离呢?你在最后一行缺少了一个括号。所以我认为每个索引[x,y]都有一个值。我只希望这个值是该点到[1,1]的距离。这更有意义吗?这个矩阵的预期格式是什么?我无法从代码中分辨。@user2305193为了完整性起见,您可能需要将此信息编辑到原始问题中。注释不能保证永远在这里。那么你打算如何计算一个10维点和一个2维点之间的距离呢?你在最后一行缺少了一个括号。所以我认为每个索引[x,y]都有一个值。我只希望这个值是该点到[1,1]的距离。这更有意义吗?这个矩阵的预期格式是什么?我无法从代码中分辨。@user2305193为了完整性起见,您可能需要将此信息编辑到原始问题中。评论不能保证永远在这里。我完全忘记了
bwdist
:D@beaker:D直到看到评论我才想到这一点。OP只是想要距离变换。太棒了,我怎么也找不到这个函数!谢谢没问题。祝你好运我完全忘记了
bwdist
:D@beaker:D直到看到评论我才想到这一点。OP只是想要距离变换。太棒了,我怎么也找不到这个函数!谢谢没问题。祝你好运