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

Matlab imcontour函数问题:层级含义与不同层级轮廓分离方法

关于MATLAB imcontour 的两个问题解答

刚好之前也折腾过imcontour的这些细节,来给你一步步讲清楚:

1. levels 参数到底指什么?

简单说,levels就是你要提取的轮廓对应的灰度值阈值。

当你调用imcontour(Img, N)(比如你用的N=3)时,MATLAB会自动根据输入图像Img的灰度范围(从图像的最小灰度值到最大灰度值),均匀划分出N个不同的灰度值,每个灰度值对应一条(或多条)轮廓线——这些灰度值就是所谓的levels。

举个实际例子:如果你的图像灰度范围是0~255,用imcontour(Img,3)的话,MATLAB会自动算出三个levels大概是85、170、255(具体数值会根据图像实际灰度分布微调),每个level对应的轮廓,就是图像中灰度等于这个值的区域的边界。

如果你不想用自动划分的levels,也可以手动指定一个数组,比如imcontour(Img, [50 150 200]),这样就只提取灰度值为50、150、200这三个值对应的轮廓。

另外你看到的不同颜色的轮廓,就是对应不同的level值——一般默认配色下,颜色越暖(比如你说的黄色),对应的level值越高(如果你的图像是亮区域在内层的话)。

2. 如何分离c中的不同层级轮廓,获取内层黄色轮廓的坐标?

首先得先搞懂返回值c的结构:c是一个二维矩阵,每一列代表一条独立的轮廓线。每一列的第一个元素是这条轮廓对应的level值,从第二个元素开始,是交替排列的x坐标和y坐标(比如x1, y1, x2, y2, ..., xn, yn)。

要提取你要的level3黄色轮廓,按下面的步骤来:

第一步:确定目标level的具体数值

先运行你的代码:

[c,h] = imcontour(Img,3);

然后在命令行输入h.LevelList,这个属性里存的就是自动生成的3个level的灰度值,比如输出可能是[84.6667 169.3333 254](具体数值根据你的图像而定)。其中第三个值h.LevelList(3)就是你要的黄色内层轮廓对应的level值。

第二步:遍历c矩阵,筛选目标level的轮廓

接下来用一段代码提取对应轮廓的坐标:

% 获取目标level值
target_level = h.LevelList(3);

% 用cell数组存储所有目标轮廓的坐标(因为可能有多个内层轮廓)
inner_contours = {};

% 遍历c的每一列(每一列是一条独立轮廓)
for col_idx = 1:size(c,2)
    % 检查当前列的第一个元素是否等于目标level
    if c(1, col_idx) == target_level
        % 提取该列的坐标部分(从第二个元素开始)
        coords = c(2:end, col_idx);
        % 拆分x和y坐标:奇数位是x,偶数位是y
        x_coords = coords(1:2:end);
        y_coords = coords(2:2:end);
        % 把这组坐标存到cell数组里,每个元素是N×2的坐标矩阵
        inner_contours{end+1} = [x_coords', y_coords'];
    end
end

运行完这段代码后,inner_contours里就保存了所有属于level3的黄色轮廓的坐标——每个cell元素是一个N×2的矩阵,每行对应一个(x,y)坐标点。

小补充

为什么是h.LevelList(3)?因为默认情况下,imcontour的配色是从冷色调到暖色调对应level值从小到大,内层的黄色轮廓一般对应最高的level值,也就是h.LevelList的最后一个元素。如果你的图像情况特殊(比如暗区域在内层),可以对比图像颜色和h.LevelList的数值来确认。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:02:36