matlab中此段代码中错误提示为:错误使用 用于矩阵乘法的维度不正确。请检查并确保第一个矩阵中的列数与第二个矩阵中的行数匹配。要执行按元素相乘请使用 。出错 ZernikePolynomial 第 5 行 polynomial = polynomial + -1^s factorialp-s factorials factorialp+q2-s facto
此段代码中的错误提示为矩阵乘法维度不匹配。在代码中,出现了两处矩阵乘法运算,分别是在ZernikeMoments函数中的sum(sum(image .* ZernikePolynomial(R, theta, p, q)))和SubpixelContour函数中的sum(sum(moments .* ZernikePolynomial(R, theta, 0:size(moments, 1)-1, 0:size(moments, 2)-1)))。根据错误提示,第一个矩阵的列数与第二个矩阵的行数不匹配,导致无法进行矩阵乘法运算。
为了解决这个问题,可以使用按元素相乘运算符 '.' 替代矩阵乘法运算符 ''。修改后的代码如下:
% 读取图像
image = imread('lena.jpg');
% 转换为灰度图像
grayImage = rgb2gray(image);
% 阈值化图像
threshold = graythresh(grayImage);
binaryImage = imbinarize(grayImage, threshold);
% 转换为二值图像
binaryImage = imcomplement(binaryImage);
% 计算Zernike矩
order = 8; % Zernike矩的阶数
moments = ZernikeMoments(binaryImage, order);
% 计算亚像素边缘轮廓
subpixelContour = SubpixelContour(binaryImage, moments);
% 显示结果
imshow(image);
hold on;
plot(subpixelContour(:, 1), subpixelContour(:, 2), 'r', 'LineWidth', 2);
hold off;
% Zernike矩计算函数
function moments = ZernikeMoments(image, order)
[rows, cols] = size(image);
[x, y] = meshgrid(1:cols, 1:rows);
moments = zeros(order+1, order+1);
for p = 0:order
for q = 0:order
if (mod(p-q, 2) == 0)
R = sqrt((x-cols/2).^2 + (y-rows/2).^2) / (rows/2);
theta = atan2(y-rows/2, x-cols/2);
moments(p+1, q+1) = sum(sum(image .* ZernikePolynomial(R, theta, p, q))) * ((p+1)/(pi*(rows/2)^2));
end
end
end
end
% Zernike多项式计算函数
function polynomial = ZernikePolynomial(R, theta, p, q)
polynomial = zeros(size(R));
for s = 0:(p-q)/2
polynomial = polynomial + (-1)^s * factorial(p-s) / (factorial(s) * factorial((p+q)/2-s) * factorial((p-q)/2-s)) * R.^(p-2*s) .* exp(1i*q*theta);
end
end
% 亚像素边缘轮廓计算函数
function subpixelContour = SubpixelContour(binaryImage, moments)
[rows, cols] = size(binaryImage);
subpixelContour = zeros(rows, 2);
for row = 1:rows
for col = 1:cols
if binaryImage(row, col) == 1
R = sqrt((col-cols/2)^2 + (row-rows/2)^2) / (rows/2);
theta = atan2(row-rows/2, col-cols/2);
subpixelContour(row, :) = [col + real(sum(sum(moments .* ZernikePolynomial(R, theta, 0:size(moments, 1)-1, 0:size(moments, 2)-1)))).* cols/2, row];
break;
end
end
end
end
通过使用按元素相乘运算符 '.' 替代矩阵乘法运算符 '',可以避免维度不匹配的错误。
原文地址: https://www.cveoy.top/t/topic/hOhX 著作权归作者所有。请勿转载和采集!