在 MATLAB 代码中,常见错误提示为“位置 1 处的索引无效。数组索引必须为正整数或逻辑值。”,这通常出现在函数 subpixelext 中,代码如下:

function [subpixel_edge] = subpixelext(edge_img, moments)
    [rows, cols] = size(edge_img);
    subpixel_edge = zeros(rows, cols);
    for x = 2:(cols-1)
        for y = 2:(rows-1)
            if edge_img(y, x) == 1
                dx = (moments(2, 1)*x + moments(2, 2)*y) / moments(1, 1);
                dy = (moments(1, 2)*x + moments(2, 2)*y) / moments(1, 1);
                
                % 亚像素插值
                dx_floor = floor(dx);
                dy_floor = floor(dy);
                dx_frac = dx - dx_floor;
                dy_frac = dy - dy_floor;
                
                % 双线性插值
                subpixel_edge(y, x) = (1-dx_frac)*(1-dy_frac)*edge_img(dy_floor, dx_floor) + ...
                    dx_frac*(1-dy_frac)*edge_img(dy_floor, dx_floor+1) + ...
                    (1-dx_frac)*dy_frac*edge_img(dy_floor+1, dx_floor) + ...
                    dx_frac*dy_frac*edge_img(dy_floor+1, dx_floor+1);
            end
        end
    end
end

错误原因在于 subpixel_edge 被定义为全零矩阵,而在循环中,只有当 edge_img(y, x) 等于 1 时才进行赋值操作。然而,由于边缘检测操作可能会导致 edge_img 中的元素值不只为 0 和 1,因此在进行索引操作时会出现错误。

解决方案:

在函数 subpixelext 中添加一个判断条件,只有当 edge_img(y, x) 等于 1 时才进行亚像素插值操作,并确保索引值在图像范围内。使用 if 语句来实现这个条件判断。

修改后的代码如下:

function [subpixel_edge] = subpixelext(edge_img, moments)
    [rows, cols] = size(edge_img);
    subpixel_edge = zeros(rows, cols);
    for x = 2:(cols-1)
        for y = 2:(rows-1)
            if edge_img(y, x) == 1
                dx = (moments(2, 1)*x + moments(2, 2)*y) / moments(1, 1);
                dy = (moments(1, 2)*x + moments(2, 2)*y) / moments(1, 1);
                
                % 亚像素插值
                dx_floor = floor(dx);
                dy_floor = floor(dy);
                dx_frac = dx - dx_floor;
                dy_frac = dy - dy_floor;
                
                % 双线性插值
                if dx_floor >= 1 && dx_floor+1 <= cols && dy_floor >= 1 && dy_floor+1 <= rows
                    subpixel_edge(y, x) = (1-dx_frac)*(1-dy_frac)*edge_img(dy_floor, dx_floor) + ...
                        dx_frac*(1-dy_frac)*edge_img(dy_floor, dx_floor+1) + ...
                        (1-dx_frac)*dy_frac*edge_img(dy_floor+1, dx_floor) + ...
                        dx_frac*dy_frac*edge_img(dy_floor+1, dx_floor+1);
                end
            end
        end
    end
end

通过添加条件判断,可以避免对无效索引进行赋值操作,从而解决此错误。

其他建议:

  • 为了提高代码效率,可以考虑使用 find 函数获取 edge_img 中值为 1 的元素的索引,然后针对这些索引进行亚像素插值操作,而不是遍历整个图像。
  • 可以使用 imdilate 函数对边缘图像进行膨胀处理,将边缘扩展至多个像素,从而减少 edge_img 中非 0 或 1 元素值出现的概率。
  • 在对图像进行边缘检测时,可以尝试使用不同的阈值或其他边缘检测算法,以获得更精确的边缘信息。

通过以上优化,可以有效解决 MATLAB 代码中的索引错误,并提高代码的效率和准确性。

MATLAB 错误:索引无效 - 解决方法及代码优化

原文地址: https://www.cveoy.top/t/topic/fzJP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录