MATLAB 错误:索引无效 - 解决方法及代码优化
在 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 代码中的索引错误,并提高代码的效率和准确性。
原文地址: https://www.cveoy.top/t/topic/fzJP 著作权归作者所有。请勿转载和采集!