我目前正在为GNU Octave编写一个版本的 MATLAB RegionProps函数。我已经实现了大部分,但我仍然在努力实现几个部分。我之前曾询问过一个区域的第二个中心时刻。
这在理论上很有帮助,但我在实际实施这些建议时遇到了麻烦。我得到的结果与 MATLAB(或常识)大不相同,我真的不明白为什么。
考虑这个测试图像:
我们可以看到它与 X 轴倾斜 45 度,短轴和长轴分别为 30 和 100。
通过 MATLAB 的RegionProps
函数运行它证实了这一点:
MajorAxisLength: 101.3362
MinorAxisLength: 32.2961
Eccentricity: 0.9479
Orientation: -44.9480
同时,我什至没有把轴弄对。我正在尝试使用来自维基百科的这些公式。
到目前为止,我的代码是:
raw_moments.m:
function outmom = raw_moments(im,i,j)
total = 0;
total = int32(total);
im = int32(im);
[height,width] = size(im);
for x = 1:width;
for y = 1:height;
amount = (x ** i) * (y ** j) * im(y,x);
total = total + amount;
end;
end;
outmom = total;
中央时刻.m:
function cmom = central_moments(im,p,q);
total = 0;
total = double(total);
im = int32(im);
rawm00 = raw_moments(im,0,0);
xbar = double(raw_moments(im,1,0)) / double(rawm00);
ybar = double(raw_moments(im,0,1)) / double(rawm00);
[height,width] = size(im);
for x = 1:width;
for y = 1:height;
amount = ((x - xbar) ** p) * ((y - ybar) ** q) * double(im(y,x));
total = total + double(amount);
end;
end;
cmom = double(total);
这是我尝试使用这些的代码。我包括对我在每个步骤中获得的值的评论:
inim = logical(imread('135deg100by30ell.png'));
cm00 = central_moments(inim,0,0); % 2567
up20 = central_moments(inim,2,0) / cm00; % 353.94
up02 = central_moments(inim,0,2) / cm00; % 352.89
up11 = central_moments(inim,1,1) / cm00; % 288.31
covmat = [up20, up11; up11, up02];
%[ 353.94 288.31
% 288.31 352.89 ]
eigvals = eig(covmat); % [65.106 641.730]
minoraxislength = eigvals(1); % 65.106
majoraxislength = eigvals(2); % 641.730
我不确定我做错了什么。我似乎正确地遵循了这些公式,但我的结果是无稽之谈。我没有在我的矩函数中发现任何明显的错误,尽管老实说我对矩的理解并不是最好的。
谁能看到我会误入歧途?非常感谢你。