Matlab 如何找到该矩形的4个最远点
我已经绘制了一个使用Harris角点检测获得的角点列表 现在我需要找到表示矩形角的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
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
需要统计工具箱。