MATLAB 错误:'用于矩阵乘法的维度不正确' 的解决方法
错误提示为'用于矩阵乘法的维度不正确。请检查并确保第一个矩阵中的列数与第二个矩阵中的行数匹配。要执行按元素相乘,请使用 '.*''。这是因为在计算邻域内的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 著作权归作者所有。请勿转载和采集!