错误提示为'用于矩阵乘法的维度不正确。请检查并确保第一个矩阵中的列数与第二个矩阵中的行数匹配。要执行按元素相乘,请使用 '.*''。这是因为在计算邻域内的Zernike矩时,矩阵乘法的维度不正确。

要解决这个问题,需要确保矩阵乘法的维度匹配。在这里,zernikeMatrix的大小是(sum(mask(:)), order+1),而neighborhood(:)是一个列向量,大小为(49, 1)。所以,可以通过转置neighborhood(:)来使其变为行向量,然后进行矩阵乘法。

修改代码如下:

zernikeCoefficients = zernikeMatrix * neighborhood(:)';

这样就可以解决错误提示了。

% 定义图像大小和阶次 imageSize = 7; % 图像大小为7 × 7 order = 5; % 阶次为5

% 创建Zernike矩模板 [x, y] = meshgrid(-1:2/(imageSize-1):1); % 创建网格坐标 [theta, rho] = cart2pol(x, y); % 转换为极坐标 mask = rho <= 1; % 创建圆形掩模 zernikeMatrix = zeros(sum(mask(:)), order+1); % 创建Zernike矩模板矩阵

% 计算Zernike矩模板系数 for n = 0:order for m = -n:2:n if mod(n-abs(m), 2) == 0 % 仅计算奇偶性满足条件的阶次和次数 zernikePolynomial = zernike(n, abs(m), rho(mask), theta(mask)); % 计算Zernike多项式 zernikeMatrix(:, (n*(n+1)/2)+m+1) = zernikePolynomial; % 将Zernike多项式存储到矩阵中 end end end

% 显示Zernike矩模板系数 disp(zernikeMatrix);

% 读取图像 image = imread('lena.jpg'); image = im2double(image);

% 转换为灰度图像 grayImage = rgb2gray(image);

% 对图像进行亚像素边缘检测 edgeImage = zeros(size(grayImage)); for i = 1:size(grayImage, 1) for j = 1:size(grayImage, 2) % 提取当前像素周围的7 × 7邻域 neighborhood = grayImage(max(i-3, 1):min(i+3, end), max(j-3, 1):min(j+3, end));

    % 计算邻域内的Zernike矩
    zernikeCoefficients = zernikeMatrix * neighborhood(:)';
    
    % 判断边缘
    if abs(zernikeCoefficients(2)) > 0.1 % 根据实际情况调整阈值
        edgeImage(i, j) = 1;
    end
end

end

% 显示边缘图像 imshow(edgeImage); function zernikePolynomial = zernike(n, m, rho, theta) % 计算Zernike多项式 % n: 阶次 % m: 次数 % rho: 极坐标半径 % theta: 极坐标角度

% 初始化Zernike多项式
zernikePolynomial = zeros(size(rho));

% 计算Zernike多项式
for k = 0:((n-abs(m))/2)
    numerator = (-1)^k * factorial(n-k);
    denominator = factorial(k) * factorial((n+abs(m))/2 - k) * factorial((n-abs(m))/2 - k);
    zernikePolynomial = zernikePolynomial + ...
        (numerator / denominator) * ...
        rho.^(n - 2*k) .* ...
        cos(m*theta).^k .* ...
        sin(m*theta).^((n-abs(m))/2 - k);
end

end


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

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