MATLAB 错误:'用于矩阵乘法的维度不正确' 的解决方法
该错误提示是因为矩阵乘法的维度不匹配。在这段代码中,zernikeMatrix 是一个矩阵,neighborhood(:) 是一个列向量。根据矩阵乘法的规则,第一个矩阵的列数必须与第二个矩阵的行数相等。
要解决这个问题,可以使用点乘运算符'.' 来执行按元素相乘,而不是矩阵乘法运算符''。修改代码如下:
zernikeCoefficients = zernikeMatrix .* neighborhood(:);
这样可以将 neighborhood(:) 扩展为与 zernikeMatrix 相同的大小,并对应元素进行相乘。
完整代码:
% 定义图像大小和阶次
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/fAEX 著作权归作者所有。请勿转载和采集!