Matlab imcontour函数问题:层级含义与不同层级轮廓分离方法
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

