MATLAB 错误:索引无效 - 'subpixelext' 函数中亚像素边缘检测问题
在代码中,出现了以下错误:
- 在函数
subpixelext中,索引subpixel_edge(y, x)是无效的,因为y和x的值可能不是整数。这是因为在计算dx和dy时,使用了浮点数除法,导致结果可能是浮点数。因此,需要将dx和dy转换为整数,然后再进行索引操作。
为了解决这个问题,你可以将以下代码修改为:
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);
这样,就可以保证索引操作中的dy_floor和dx_floor是整数,避免了索引无效的错误。
% 读取图像 img = imread('lena.jpg'); gray_img = im2gray(img); % 阈值化图像 threshold = graythresh(gray_img); binary_img = imbinarize(gray_img, threshold); % 提取边缘 edge_img = edge(binary_img,'canny'); % 计算Zernike矩 order =8; % Zernike矩的阶数 moments = Zernikmoment(edge_img, order); % 亚像素检测边缘轮廓 subpixel_edge = subpixelext(edge_img, moments); % 显示结果 figure; subplot(1, 2, 1); imshow(edge_img); title('原始边缘图像'); subplot(1, 2, 2); imshow(subpixel_edge); title('亚像素检测边缘轮廓'); % Zernike矩计算函数 function [moments] = Zernikmoment(img, order) [rows, cols] = size(img); moments = zeros(order+1, order+1); for p = 0:order for q = 0:order if mod(p-q, 2) == 0 R = zeros(rows, cols); for x = 1:cols for y = 1:rows r = sqrt((x-cols/2)^2 + (y-rows/2)^2) / (cols/2); if r <= 1 theta = atan2(y-rows/2, x-cols/2); R(y, x) = ZernikeRadialPolynomial(p, q, r) * cos(qtheta); end end end moments(p+1, q+1) = sum(sum(img.R)) * ((p+1)/(pi(q+1))); end end end end % Zernike径向多项式计算函数 function [R] = ZernikeRadialPolynomial(n, m, r) R = zeros(size(r)); for s = 0:(n-abs(m))/2 c = (-1)^s * factorial(n-s) / (factorial(s) * factorial((n+abs(m))/2-s) * factorial((n-abs(m))/2-s)); R = R + c * r.^(n-2s); end end 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
原文地址: https://www.cveoy.top/t/topic/fzJE 著作权归作者所有。请勿转载和采集!