如何在二值化菱形图像中求解最大垂直距离
如何在二值化菱形图像中求解最大垂直距离
嗨,我来帮你搞定这个问题!你现在的代码能找出图像里全局最长的欧氏距离(也就是图里那条水平红线),但你要的是菱形上下方向的最大距离——也就是把那条红线转90度的效果对吧?我给你几个针对性的解决方案,你可以根据实际需求选:
先理清楚核心需求
你要的其实是两种可能的“垂直距离”之一:
- 菱形在竖直方向(y轴)的最大跨度:也就是最顶端点和最底端点的y坐标差值;
- 菱形上下顶点之间的对角线长度:也就是你说的“旋转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
相关产品推荐
相关产品推荐

