如何利用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
相关产品推荐
相关产品推荐

