找到菱形中最大的垂直距离

问题描述 投票:0回答:1

我有以下问题: 我从图像中提取了菱形并将其转换为二值图像。在那个菱形内我需要找到最大的垂直距离。

使用我当前的代码,无论方向是什么,我都可以检测到最大距离(以红色显示):

rhombus image with overlaid horizontal line

但我只对菱形的上下角点之间的最大距离感兴趣(所以想象红线旋转了〜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)

手动单击点在这里是没有选择的,我需要它自动化。

我真的很感谢你的帮助!

matlab image-processing
1个回答
0
投票

要找到菱形内的最大垂直距离,您需要特别关注点的 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)
之间的差异给出了垂直距离。

这段代码应该找到并显示菱形内的最大垂直距离,它不漂亮,而且是幻灯片的死亡,但应该完成工作。

© www.soinside.com 2019 - 2024. All rights reserved.