В настоящее время я работаю над написанием версии функции MATLAB RegionProps для GNU Octave . У меня большая часть этого реализована, но я все еще борюсь с реализацией нескольких частей. Я ранее спрашивал о вторых центральных моментах региона.
Теоретически это было полезно, но у меня возникли проблемы с реализацией предложений. Я получаю результаты, сильно отличающиеся от результатов MATLAB (или здравого смысла), и действительно не понимаю, почему.
Рассмотрим этот тестовый образ:
Мы видим, что он наклонен под углом 45 градусов от оси X, с малой и большой осями 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;
central_moments.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
Я не уверен, что я делаю неправильно. Кажется, я правильно следую этим формулам, но мои результаты бессмысленны. Я не обнаружил никаких очевидных ошибок в своих функциях моментов, хотя, честно говоря, мое понимание моментов не самое лучшее для начала.
Кто-нибудь может увидеть, куда я сбился с пути? Большое спасибо.