计算图像的矩,通过矩来计算图像的不变矩特征。
采用了两种方式计算不变矩。
第一种,直接采用循环实现:
%
计算图像平面上区域的矩
% 参考:《图像工程(中册)图像分析》P240
% f 输入二维图像(函数)
% (p,q) 需要计算的阶数
% 返回:
% 函数 f(x,y) 的 p + q 阶矩
function [moment] = CalculateMoment(f,p,q)
[xSize,ySize] = size(f); % 计算横纵范围
f = double (f); % 类型抓换
moment = 0.0 ;
tic
testtimes = 10000 ; % 测试次数
for mm = 1 :testtimes
for x = 1 :xSize
for y = 1 :ySize
moment = moment + (x ^ p) * (y ^ q) * f(x,y); % 计算代码
end
end
end
moment = moment / testtimes
toc
% 参考:《图像工程(中册)图像分析》P240
% f 输入二维图像(函数)
% (p,q) 需要计算的阶数
% 返回:
% 函数 f(x,y) 的 p + q 阶矩
function [moment] = CalculateMoment(f,p,q)
[xSize,ySize] = size(f); % 计算横纵范围
f = double (f); % 类型抓换
moment = 0.0 ;
tic
testtimes = 10000 ; % 测试次数
for mm = 1 :testtimes
for x = 1 :xSize
for y = 1 :ySize
moment = moment + (x ^ p) * (y ^ q) * f(x,y); % 计算代码
end
end
end
moment = moment / testtimes
toc
输出为:
moment = 1.2885e+003
Elapsed time is 12.563000 seconds.
第二种方式,采用矩阵运算实现:
testtimes
=
10000
;
for mm = 1 :testtimes
xMatrix = zeros(xSize,ySize);
yMatrix = zeros(xSize,ySize);
for i = 1 :xSize
xMatrix(i,:) = i;
end
for j = 1 :ySize
yMatrix(:,j) = j;
end
moment = sum(sum((xMatrix. ^ p). * (yMatrix. ^ q). * f));% 计算矩
end
toc
for mm = 1 :testtimes
xMatrix = zeros(xSize,ySize);
yMatrix = zeros(xSize,ySize);
for i = 1 :xSize
xMatrix(i,:) = i;
end
for j = 1 :ySize
yMatrix(:,j) = j;
end
moment = sum(sum((xMatrix. ^ p). * (yMatrix. ^ q). * f));% 计算矩
end
toc
输出为:Elapsed time is 5.907000 seconds.
花费时间不到前面的一半。
倘若把内存分配与初始化工作放到循环测试的外边,即
xMatrix
=
zeros(xSize,ySize);
yMatrix = zeros(xSize,ySize);
for i = 1 :xSize
xMatrix(i,:) = i;
end
for j = 1 :ySize
yMatrix(:,j) = j;
end
testtimes = 10000 ;
for mm = 1 :testtimes
moment = sum(sum((xMatrix. ^ p). * (yMatrix. ^ q). * f)); % 计算矩
end
toc
yMatrix = zeros(xSize,ySize);
for i = 1 :xSize
xMatrix(i,:) = i;
end
for j = 1 :ySize
yMatrix(:,j) = j;
end
testtimes = 10000 ;
for mm = 1 :testtimes
moment = sum(sum((xMatrix. ^ p). * (yMatrix. ^ q). * f)); % 计算矩
end
toc
输出为:Elapsed time is 4.782000 seconds.
运算时间可以进一步减少。