我有以下问题:我从图像中提取了一个菱形并将其转换为二进制图像。我需要在该菱形内找到最大的垂直距离。
使用我当前的代码,我可以检测到最大距离(以红色显示),无论方向如何:
但我只对菱形上角点和下角点之间的最大距离感兴趣(所以想象红线旋转约 90 度),这是第二大距离。
我的代码如下(受此帖子启发:找到 Canny 边缘输出的最大欧几里得距离并在点之间画一条线)
clc; clear all;
im = imread('picture');
sharp = imsharpen(im);
grayImage1 = im2gray(sharp);
BinaryImage1 = imbinarize(grayImage1, 0.7);
imshow(BinaryImage1);
title('Extract rhombus');
[posX1, posY1, P1] = impixel;
Rhombus1 = bwselect(BinaryImage1, posX1, posY1);
BW1 = edge(Rhombus1,'Canny',0.8);
hold on;
[ y, x] = find( BW1);
points = [ x y];
[d,idx] = pdist2( points, points, 'euclidean', 'Largest', 1);
idx1 = idx( d==max(d));
[~,idx2] = find(d==max( d));
p={};
for i=1:length(idx1)
p{end+1} = [ points(idx1(i),1), points(idx1(i),2), points(idx2(i),1), points(idx2(i),2)];
end
figure;
imshow(BW1);
hold on;
for i=1:numel(p)
line( [ p{i}(1), p{i}(3)], [p{i}(2), p{i}(4)]);
hdl = get(gca,'Children');
set( hdl(1),'LineWidth',2);
set( hdl(1),'color',[1 0 0]);
end
hold off;
tmp = p{1,1};
dx = tmp(1,1) - tmp(1,3);
dy = tmp(1,2) - tmp(1,4);
Distance = sqrt((tmp(1,3)-tmp(1,1))^2+(tmp(1,4)-tmp(1,2))^2)
手动单击点在这里没有其他选择,我需要它自动化。
我非常感谢您的帮助!
要找到菱形内的最大垂直距离,您需要特别关注点的 y 坐标,而不是整体欧几里得距离。我修改了您的代码来解决这个问题:
find(BW1)
给出边缘点的坐标。min(y)
并max(y)
确定菱形内的 y 坐标。max(y)
和之间的差值min(y)
给出垂直距离。此代码应查找并显示菱形内的最大垂直距离,它并不漂亮并且容易被 powerpoint 搞死,但应该可以完成工作。