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

如何利用MATLAB regionprops的凸包数据计算周长凸度?

用MATLAB的regionprops计算周长凸度

首先得明确周长凸度的常用定义:它是衡量一个形状接近凸形的程度,公式一般是:

周长凸度 = 凸包的周长 ÷ 目标的实际周长

完美的凸形(比如圆)这个值就是1,形状越凹、越不规则,这个值就越小(因为实际周长会比凸包周长大很多)。

你已经写了计算凸包周长的部分,现在只需要补充获取目标实际周长的步骤,就能算出凸度了。下面是完整的可运行代码,我会一步步解释:

完整示例代码

clc; clear; 
% 读取图像并做二值化处理
a = imread('circlesBrightDark.png'); 
bw = a < 100; 
imshow(bw); 
title('Image with Circles');

% 关键:regionprops里要同时拿实际周长、凸包和质心
stats = regionprops('table', bw, 'Centroid', 'ConvexHull', 'Perimeter');

% 遍历每个区域计算凸度
convexity_scores = [];
for k = 1:height(stats)
    % 获取当前区域的凸包顶点
    convex_hull_points = stats.ConvexHull{k};
    % 计算凸包的周长(就是你已经写的部分)
    convex_perim = perimeter(convex_hull_points);
    % 直接从stats里拿目标的实际周长,不用自己算
    obj_perim = stats.Perimeter(k);
    % 计算凸度,加eps是防止除以0的情况
    convexity = convex_perim / max(obj_perim, eps);
    convexity_scores = [convexity_scores; convexity];
end

% 把凸度结果加到stats表格里,方便查看
stats.Convexity = convexity_scores;

% 打印结果看看
disp('每个区域的质心和周长凸度:');
disp(stats(:, {'Centroid', 'Convexity'}));

关键步骤解释

  • 补充获取实际周长:在regionprops的参数里加上'Perimeter',MATLAB会直接帮你计算每个目标区域的实际周长,比手动计算更准确高效。
  • 凸度计算逻辑:用凸包周长除以实际周长,这里用max(obj_perim, eps)是为了避免有些极小区域的周长为0,导致除以0的错误。
  • 结果整合:把计算好的凸度放到stats表格里,这样可以和质心、凸包这些属性一起查看,后续分析也方便。

小提醒

如果你的场景里对凸度的定义是实际周长 ÷ 凸包周长,只需要把分子分母调换就行,但通常前者(凸包周长/实际周长)更常用——毕竟凸形的凸度为1,直观易懂。

内容的提问来源于stack exchange,提问作者wrek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:52:02