Octave实现Zhang-Suen细化算法触发下标索引报错排查
问题排查结论
报错的直接原因是待处理像素列表的初始化逻辑有问题,导致你用0作为下标访问Octave数组——Octave和Matlab一致,数组下标从1开始,0属于非法下标。
具体错误链路:
- 你初始化存储待修改像素坐标的变量时,写了
tabPixel = zeros(2,1);,这会生成一个值全为0的2行1列矩阵,第一行、第一列的初始值是(0,0),不是任何有效像素的坐标。 - 后续双重循环筛选符合细化条件的像素时,你通过
tabPixel = [tabPixel, [x; y]]的方式往列表尾部追加有效坐标,所有真实像素坐标都存在tabPixel的第2列及之后的位置,第一列始终保留着初始的(0,0)。 - 最后遍历
tabPixel修改像素时,循环从i=1开始,第一次迭代就会取到第一列的(0,0)坐标,用0作为行索引访问imgSeuil,直接触发你看到的下标非法报错。
修复方案
二选一即可解决当前下标报错:
- 方案1:初始化时直接创建空矩阵,不保留无意义的初始零值
% 替换原代码中 tabPixel = zeros(2,1); tabPixel = []; - 方案2:保留原有初始化逻辑,遍历坐标时跳过第一列的初始无效值
% 替换原代码中 for i=1:columns(tabPixel) for i=2:columns(tabPixel)
额外逻辑问题提醒
修完下标错误后,你代码里还有两处逻辑错误会导致算法运行结果不符合预期,建议同步修正:
- 行列索引写反:前面定义
NL为图像行数(高度维度)、NC为图像列数(宽度维度),但细化部分的双重循环写为for x=2:NL-1、for y=2:NC-1,把行、列维度搞反了,运行时会出现索引越界、邻域像素取值错误的问题,循环维度需要和前面二值化部分保持一致,行索引用NL范围、列索引用NC范围。 - 像素赋值逻辑反了:Zhang-Suen算法第一步标记的是需要删除的前景像素,你当前代码把标记像素赋值为255(前景白色),和算法逻辑相反,应该将标记像素置为0(背景黑色)才对。
内容的提问来源于stack exchange,提问作者Débart Rédouane
相关产品推荐
相关产品推荐

