按欧式距离移除矩阵元素
Remove Elements of matrix by eucledian distance
我有一个包含 E
个非零元素的 mxn
矩阵。非零点的坐标已经在 Ex2
向量中可用。
我想检查每对非零元素之间的最小欧氏距离是否至少为 d
。如果不是这种情况,我想通过将一些元素归零来强制执行它(到底是哪些元素并不重要)。
在 Matlab 中有没有一种优雅的方法可以做到这一点?
目前有大量有效的方法可以解决这个问题。选择正确的一个将取决于您的数据的实际性质以及您要用于细化它的逻辑。
一种相当简单的方法是扩大每个非零元素,使单个 "pixel" 成为半径为 d
的圆。然后,任何彼此靠得太近的像素都将通过它们连接的圆圈显而易见。
E = rand(100)<0.001; % dummy boolean data
d = 6;
E_dilated = imdilate(E, strel('disk', d, 0));
E_dilated_labeled = bwlabel(E_dilated);
E_labeled = E_dilated_labeled;
E_labeled(~E) = 0;
你从这里做什么完全取决于你。如果您真的不知道如何完成它,请在评论中 post。
其他方法可能会使用 bwmorph
, bwdist
, watershed
, delaunay
triangulation, and perhaps even k-means or agglomerative hierarchical clustering 中的一种或多种方法,或者完全使用其他方法。
考虑一下,如果将非零条目视为地图上的标记,则此问题在地图应用程序中相当普遍。 Google 地图 API long page 关于他们提供的各种选项。
这些图是使用以下额外代码生成的:
subplot(3,1,1);
imshow(ind2rgb(E, gray(2))); axis image
title('E (as Boolean)');
subplot(3,1,2);
im = ind2rgb(E_dilated_labeled, lines(max(E_dilated_labeled(:)+1)));
im(repmat(~E_dilated_labeled, [1,1,3])) = 0;
imshow(im); axis image;
title('E\_dilated\_labeled');
subplot(3,1,3);
im = ind2rgb(E_labeled, lines(max(E_labeled(:)+1)));
im(repmat(~E_labeled, [1,1,3])) = 0;
imshow(im); axis image;
title('E\_labeled');
这是给你的简单代码:)
我添加了一个结果样本作为图像
% Initialise the constants
d = 0.1; % Distance Threshold
E = rand(20,2); % Random Mx2 matrix of x and y coordinates
% Display initial matrix
fig1 = figure;
Ex = E(:,1);
Ey = E(:,2);
scatter(Ex, Ey);
% Repeat each coordinate to form a square matrix
ExRep = repmat(Ex, 1, length(Ex));
EyRep = repmat(Ey, 1, length(Ey));
% Calculate the distance between every set of points
distX = ExRep - ExRep';
distY = EyRep - EyRep';
distAll = sqrt(distX.^2 + distY.^2);
% Display the distance between every set of points
figure;
imagesc(distAll);
colormap('gray')
title('Grid of distance from each points');
% Find the points that are at less then a certain distance
smallDist = distAll < d;
figure;
imagesc(smallDist);
colormap('gray')
title('Grid of points with small distance neighbour');
% Find the points with no near neighbours
numNearNeighbour = (sum(smallDist) - 1);
noNearNeighbour = numNearNeighbour == 0;
E2 = E;
E2(noNearNeighbour, :) = [];
% Display the new matrix
figure(fig1);
hold all;
Ex2 = E2(:,1);
Ey2 = E2(:,2);
scatter(Ex2, Ey2, 'marker', '*');
legend({'all points', ['points with neighbours distance < ' num2str(d)]}, 'location', 'northoutside');
hold off;
我有一个包含 E
个非零元素的 mxn
矩阵。非零点的坐标已经在 Ex2
向量中可用。
我想检查每对非零元素之间的最小欧氏距离是否至少为 d
。如果不是这种情况,我想通过将一些元素归零来强制执行它(到底是哪些元素并不重要)。
在 Matlab 中有没有一种优雅的方法可以做到这一点?
目前有大量有效的方法可以解决这个问题。选择正确的一个将取决于您的数据的实际性质以及您要用于细化它的逻辑。
一种相当简单的方法是扩大每个非零元素,使单个 "pixel" 成为半径为 d
的圆。然后,任何彼此靠得太近的像素都将通过它们连接的圆圈显而易见。
E = rand(100)<0.001; % dummy boolean data
d = 6;
E_dilated = imdilate(E, strel('disk', d, 0));
E_dilated_labeled = bwlabel(E_dilated);
E_labeled = E_dilated_labeled;
E_labeled(~E) = 0;
你从这里做什么完全取决于你。如果您真的不知道如何完成它,请在评论中 post。
其他方法可能会使用 bwmorph
, bwdist
, watershed
, delaunay
triangulation, and perhaps even k-means or agglomerative hierarchical clustering 中的一种或多种方法,或者完全使用其他方法。
考虑一下,如果将非零条目视为地图上的标记,则此问题在地图应用程序中相当普遍。 Google 地图 API long page 关于他们提供的各种选项。
这些图是使用以下额外代码生成的:
subplot(3,1,1);
imshow(ind2rgb(E, gray(2))); axis image
title('E (as Boolean)');
subplot(3,1,2);
im = ind2rgb(E_dilated_labeled, lines(max(E_dilated_labeled(:)+1)));
im(repmat(~E_dilated_labeled, [1,1,3])) = 0;
imshow(im); axis image;
title('E\_dilated\_labeled');
subplot(3,1,3);
im = ind2rgb(E_labeled, lines(max(E_labeled(:)+1)));
im(repmat(~E_labeled, [1,1,3])) = 0;
imshow(im); axis image;
title('E\_labeled');
这是给你的简单代码:)
我添加了一个结果样本作为图像
% Initialise the constants
d = 0.1; % Distance Threshold
E = rand(20,2); % Random Mx2 matrix of x and y coordinates
% Display initial matrix
fig1 = figure;
Ex = E(:,1);
Ey = E(:,2);
scatter(Ex, Ey);
% Repeat each coordinate to form a square matrix
ExRep = repmat(Ex, 1, length(Ex));
EyRep = repmat(Ey, 1, length(Ey));
% Calculate the distance between every set of points
distX = ExRep - ExRep';
distY = EyRep - EyRep';
distAll = sqrt(distX.^2 + distY.^2);
% Display the distance between every set of points
figure;
imagesc(distAll);
colormap('gray')
title('Grid of distance from each points');
% Find the points that are at less then a certain distance
smallDist = distAll < d;
figure;
imagesc(smallDist);
colormap('gray')
title('Grid of points with small distance neighbour');
% Find the points with no near neighbours
numNearNeighbour = (sum(smallDist) - 1);
noNearNeighbour = numNearNeighbour == 0;
E2 = E;
E2(noNearNeighbour, :) = [];
% Display the new matrix
figure(fig1);
hold all;
Ex2 = E2(:,1);
Ey2 = E2(:,2);
scatter(Ex2, Ey2, 'marker', '*');
legend({'all points', ['points with neighbours distance < ' num2str(d)]}, 'location', 'northoutside');
hold off;