这段代码中,显示一片黑的图像可能是由于边缘检测的阈值设置不合适导致的。可以尝试调整阈值的值来解决这个问题。

在代码中,阈值的值为'0.1',可以尝试逐步增大阈值的值,例如'0.2'、'0.3'等,看看是否能够得到更好的结果。调整阈值的值可以通过修改'threshold'变量来实现。

另外,还可以尝试调整Zernike矩的阶次和次数,看看是否能够得到更好的边缘检测结果。可以修改'order'变量的值来调整Zernike矩的阶次和次数。

如果以上方法仍然无法解决问题,可能需要进一步检查代码中的其他部分,例如图像读取和处理部分是否正确,Zernike多项式计算是否正确等。

% 定义图像大小和阶次 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'); % 读取图像 grayImage = rgb2gray(image); % 转换为灰度图像 binaryImage = imbinarize(grayImage); % 二值化图像

% 计算图像的Zernike矩 zernikeMoments = zeros(1, order+1); % 创建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多项式 zernikeMoment = sum(sum(zernikePolynomial .* binaryImage(mask))); % 计算Zernike矩 zernikeMoments(1, (n*(n+1)/2)+m+1) = zernikeMoment; % 存储Zernike矩 end end end

% 根据Zernike矩进行边缘检测 threshold = 0.1; % 阈值 edgeImage = zeros(size(grayImage)); % 创建边缘图像 for i = 1:size(binaryImage, 1) for j = 1:size(binaryImage, 2) distance = sqrt(sum((zernikeMoments - zernikeMatrix) .^ 2, 2)); % 计算Zernike矩之间的欧氏距离 [~, index] = min(distance); % 找到距离最小的索引 if distance(index) < threshold % 如果距离小于阈值,则认为是边缘点 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

MATLAB Zernike 矩边缘检测显示黑图解决方法

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

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