Matlab 如何找到该矩形的4个最远点

Matlab 如何找到该矩形的4个最远点,matlab,max,min,rectangles,corner-detection,Matlab,Max,Min,Rectangles,Corner Detection,我已经绘制了一个使用Harris角点检测获得的角点列表 现在我需要找到表示矩形角的4个进一步点 我知道我可以使用 max(C); min(C); 其中C是一个n行矩阵,其中一列表示x和y,如 x y 0 1 2 3 4 5 6 6 但是我怎么才能到达另外两个角落呢 我想我可以旋转矩阵并再次使用最小值和最大值,但当然这只会返回一个巨大的n列矩阵(我想要一个2列矩阵) 我觉得答案很明显,但我没有回答:(我不知道下面的方法有多有限,但它适用于与您类似的示例: % de

我已经绘制了一个使用Harris角点检测获得的角点列表

现在我需要找到表示矩形角的4个进一步点

我知道我可以使用

  max(C);
  min(C);
其中C是一个n行矩阵,其中一列表示x和y,如

  x y
  0 1
  2 3
  4 5
  6 6
但是我怎么才能到达另外两个角落呢

我想我可以旋转矩阵并再次使用最小值和最大值,但当然这只会返回一个巨大的n列矩阵(我想要一个2列矩阵)


我觉得答案很明显,但我没有回答:(

我不知道下面的方法有多有限,但它适用于与您类似的示例:

% detect possible corners
points = detectHarrisFeatures(BW);
C = points.Location;
% compute par-wise distances between all points
D = pdist2(C,C);
p = zeros(1,4);
% compute maximum distance to find first pair
[m,idx1] = max(D,[],2);
[~,idx2] = max(m);
idx1 = idx1(idx2);
p(1:2) = [idx1, idx2];
% add first pair distance to distance matrix so the next pair will be
% distant from this pair as well, and compute max distance again
D = bsxfun(@plus,D,sum(D([idx1 idx2],:),1));
[m,idx1] = max(D,[],2);
[~,idx2] = max(m);
idx1 = idx1(idx2);
p(3:4) = [idx1, idx2];
% plot
imshow(BW);
hold on;
plot(C(:,1),C(:,2),'g.');
plot(C(p,1),C(p,2),'rx','LineWidth',2);


另一种选择是使用FEX函数,如and,并将所需顶点的数量设置为4。

我不知道以下方法有多有限,但它适用于与您类似的示例:

% detect possible corners
points = detectHarrisFeatures(BW);
C = points.Location;
% compute par-wise distances between all points
D = pdist2(C,C);
p = zeros(1,4);
% compute maximum distance to find first pair
[m,idx1] = max(D,[],2);
[~,idx2] = max(m);
idx1 = idx1(idx2);
p(1:2) = [idx1, idx2];
% add first pair distance to distance matrix so the next pair will be
% distant from this pair as well, and compute max distance again
D = bsxfun(@plus,D,sum(D([idx1 idx2],:),1));
[m,idx1] = max(D,[],2);
[~,idx2] = max(m);
idx1 = idx1(idx2);
p(3:4) = [idx1, idx2];
% plot
imshow(BW);
hold on;
plot(C(:,1),C(:,2),'g.');
plot(C(p,1),C(p,2),'rx','LineWidth',2);


另一种选择是使用FEX函数,如and,并将所需顶点数设置为4。

如果不想使用角点检测,另一种替代解决方案:

im=zeros(100);

im(40:70,30:80)=1;
im=imrotate(im,rand*100);

[x,y]=find(im);
x=x+2*randn(size(x));
y=y+2*randn(size(y));
X=[x(:),y(:)]; 

d=ceil(pdist2(X,X)*10)/10;

[a,b]=find(d==max(d(:))); 

xm=x(a);
ym=y(a);

figure,plot(x,y,'ks')
hold on, plot(xm,ym,'ro','MarkerSize',12,'MArkerFaceColor','r')
axis image

如果您不想使用角点检测,另一种替代解决方案:

im=zeros(100);

im(40:70,30:80)=1;
im=imrotate(im,rand*100);

[x,y]=find(im);
x=x+2*randn(size(x));
y=y+2*randn(size(y));
X=[x(:),y(:)]; 

d=ceil(pdist2(X,X)*10)/10;

[a,b]=find(d==max(d(:))); 

xm=x(a);
ym=y(a);

figure,plot(x,y,'ks')
hold on, plot(xm,ym,'ro','MarkerSize',12,'MArkerFaceColor','r')
axis image


C的行代表什么?边界上的坐标?白色区域内的点?黑色区域?像您这样使用
min
max
是非常危险的,因为无法保证返回值属于同一个角点。您的输入是黑白图像,还是此
C
?Would您可以上传您可用的原始输入(无论是BW图像还是有限大小的矩阵)…C行是哈里斯角点检测结果的坐标,C行是我发布的图像中蓝色点的坐标。因此,如果max从每个列返回最大值,我想我实际上没有任何点:'(这里是数据点的链接(比我想象的要大得多)试着用数学方法写下如何定义角点坐标。例如,你可以检测到一个比实际左下角更左的角点,因为你最小化了x坐标……我以不同的方式回答了我的问题,并将其发布在这里。我要睡一觉。希望它在早上会很明显:)
C
的行代表什么?边界上的坐标?白色区域内的点?黑色区域?像您这样使用
min
max
是非常危险的,因为无法保证返回的值属于同一个角点。您的输入是黑白图像还是此
C
上传可供您使用的原始输入(无论是BW图像还是有限大小的矩阵)…C行是哈里斯角点检测结果的坐标,C行是我发布的图像中蓝色点的坐标。因此,如果max从每个列返回最大值,我想我实际上没有任何点:'(这里是数据点的链接(比我想象的要大得多)试着用数学方法写下如何定义角点坐标。例如,你可以检测到一个比实际左下角更左的角点,因为你最小化了x坐标……我以不同的方式回答了我的问题,并将其发布在这里。我要睡一觉。希望它在早上会很明显:)注意:这使用了计算机视觉工具箱(即,
detectHarrisFeatures
)。OP可能无法访问此功能。是的。这只是为了获得OP已经拥有的一组可能点的示例。同意!但我仍然喜欢。我会亲自与Harris Corners联系。注意:这使用了计算机视觉工具箱(即
检测错误特征
)。OP可能无法访问此项。正确。这只是为了获得OP已经拥有的一组可能点的示例。同意!但我仍然喜欢。我会亲自与Harris Corners联系。NB:
pdist2
需要统计工具箱。NB:
pdist2
需要统计工具箱。