我有以下问题: 我从图像中提取了菱形并将其转换为二值图像。在那个菱形内我需要找到最大的垂直距离。
使用我当前的代码,无论方向是什么,我都可以检测到最大距离(以红色显示):
但我只对菱形的上下角点之间的最大距离感兴趣(所以想象红线旋转了〜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 坐标,而不是整体欧几里德距离。 我修改了你的代码来解决这个问题:
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; % You can remove or skip this part if not needed
Rhombus1 = bwselect(BinaryImage1, posX1, posY1);
BW1 = edge(Rhombus1,'Canny',0.8);
hold on;
% Find the edge points of the rhombus
[y, x] = find(BW1);
% Find the uppermost and lowermost points based on y-coordinate
[minY, minIdx] = min(y);
[maxY, maxIdx] = max(y);
% Calculate the largest vertical distance
verticalDistance = maxY - minY;
% Plot the vertical line between the uppermost and lowermost points
figure;
imshow(BW1);
hold on;
line([x(minIdx), x(maxIdx)], [minY, maxY], 'Color', 'r', 'LineWidth', 2);
hold off;
% Display the distance
fprintf('Largest Vertical Distance: %.2f pixels\n', verticalDistance);
find(BW1)
为您提供边缘点的坐标。 min(y)
和 max(y)
确定菱形内的 y 坐标。 max(y)
和 min(y)
之间的差异给出了垂直距离。
这段代码应该找到并显示菱形内的最大垂直距离,它不漂亮,而且是幻灯片的死亡,但应该完成工作。