You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在二值化菱形图像中求解最大垂直距离

如何在二值化菱形图像中求解最大垂直距离

嗨,我来帮你搞定这个问题!你现在的代码能找出图像里全局最长的欧氏距离(也就是图里那条水平红线),但你要的是菱形上下方向的最大距离——也就是把那条红线转90度的效果对吧?我给你几个针对性的解决方案,你可以根据实际需求选:

先理清楚核心需求

你要的其实是两种可能的“垂直距离”之一:

  1. 菱形在竖直方向(y轴)的最大跨度:也就是最顶端点和最底端点的y坐标差值;
  2. 菱形上下顶点之间的对角线长度:也就是你说的“旋转90度的红线”,这是上下两个角点之间的欧氏距离,也是菱形的竖直对角线长度。

解决方案代码(整合到你的现有流程里)

先把你的预处理代码补全,然后针对不同需求添加逻辑:

clc; clear all;

% 读取图像并预处理(和你的代码衔接)
im = imread('picture');
sharp = imsharpen(im);
grayImage1 = im2gray(sharp);
BinaryImage1 = imbinarize(grayImage1); % 可根据实际情况调整阈值

% 提取二值图像中所有前景点的坐标(x是水平列,y是垂直行)
[y, x] = find(BinaryImage1);

方法1:求竖直方向的最大跨度(y坐标差)

如果只需要知道菱形在竖直方向的总高度,直接找y的最大值和最小值就行:

max_y = max(y);
min_y = min(y);
vertical_span = max_y - min_y;

% 找到对应的上下点(如果有多个点,取第一个即可)
top_point = [x(y == min_y)(1), min_y];
bottom_point = [x(y == max_y)(1), max_y];

% 可视化(可选)
figure; imshow(BinaryImage1); hold on;
plot([top_point(1), bottom_point(1)], [top_point(2), bottom_point(2)], 'r-', 'LineWidth', 2);
title('竖直方向最大跨度');
hold off;

方法2:求菱形上下顶点的对角线长度(你要的“旋转90度红线”)

因为菱形是凸多边形,我们可以先通过凸包找到它的四个顶点,再筛选出上下顶点计算距离:

% 计算凸包,得到菱形的四个顶点
k = convhull(x, y);
hull_points = [x(k), y(k)];
hull_points = unique(hull_points, 'rows'); % 去除重复的凸包点

% 遍历所有顶点对,找到y坐标差最大的一对(就是上下顶点)
max_vertical_dist = 0;
top_vertex = [];
bottom_vertex = [];

for i = 1:size(hull_points, 1)
    for j = i+1:size(hull_points, 1)
        y_diff = abs(hull_points(i,2) - hull_points(j,2));
        if y_diff > max_vertical_dist
            max_vertical_dist = y_diff;
            % 区分上下顶点
            if hull_points(i,2) < hull_points(j,2)
                top_vertex = hull_points(i,:);
                bottom_vertex = hull_points(j,:);
            else
                top_vertex = hull_points(j,:);
                bottom_vertex = hull_points(i,:);
            end
        end
    end
end

% 计算上下顶点的欧氏距离(就是你要的那条竖对角线长度)
vertical_diag_length = sqrt((top_vertex(1)-bottom_vertex(1))^2 + (top_vertex(2)-bottom_vertex(2))^2);

% 可视化(画出你想要的红线)
figure; imshow(BinaryImage1); hold on;
plot([top_vertex(1), bottom_vertex(1)], [top_vertex(2), bottom_vertex(2)], 'r-', 'LineWidth', 2);
title('菱形竖直对角线(最大垂直方向距离)');
hold off;

为什么你的原代码不行?

你的原代码是计算所有边缘点对的欧氏距离,取最大值——而菱形的水平对角线通常是全局最长的(尤其是扁菱形),所以会优先找到那条线。我们上面的方法通过筛选y坐标相关的点对,就能精准定位到你需要的垂直方向最大距离啦!

备注:内容来源于stack exchange,提问作者Annika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:44:38