在 Matlab 中,数组的索引必须是正整数或逻辑值,不能是浮点数。在亚像素边缘检测代码中,出现错误的地方是在亚像素插值的双线性插值部分。在计算 subpixel_edge(y, x) 时,使用了浮点数索引 dx_floordy_floor。要解决这个问题,可以将 dx_floordy_floor 转换为整数索引,即使用 floor 函数将其取整。

修改后的代码如下:

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

这样修改后,应该能够解决索引无效的错误提示。

Matlab 错误提示: 位置 1 处的索引无效 - 如何解决亚像素边缘检测错误

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

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