Obliczanie statystyki obiektu z drugiego głównego momentu

Obecnie pracuję nad napisaniem wersji MATLABRegionProps funkcja dlaOktawa GNU. Mam większość z nich zaimplementowanych, ale wciąż zmagam się z implementacją kilku części. miałemwcześniej zapytany odrugie główne momenty regionu.

To było teoretycznie pomocne, ale mam problemy z implementacją sugestii. Wyniki są bardzo różne od MATLAB-a (lub zdrowego rozsądku w tej kwestii) i naprawdę nie rozumiem dlaczego.

Rozważ ten obraz testowy:

Widzimy go nachylonego pod kątem 45 stopni od osi X, z mniejszymi i głównymi osiami, odpowiednio 30 i 100.

Uruchamianie go przez MATLABRegionProps funkcja potwierdza to:

MajorAxisLength: 101.3362
MinorAxisLength: 32.2961
Eccentricity: 0.9479
Orientation: -44.9480

W międzyczasie nawet nie rozumiem toporów. Próbuję użyćte wzory z Wikipedii.

Mój dotychczasowy kod to:

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);

A oto mój kod próbujący ich użyć. Dołączam komentarze do wartości, które otrzymuję na każdym kroku:

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

Nie wiem, co robię źle. Wydaje mi się, że podążam za tymi formułami poprawnie, ale moje wyniki są nonsensowne. W moim momencie nie znalazłem żadnych oczywistych błędów, chociaż szczerze mówiąc, moje zrozumienie momentów nie jest najlepsze na początku.

Czy ktoś może zobaczyć, dokąd zmierzam? Dziękuję Ci bardzo.

questionAnswers(2)

yourAnswerToTheQuestion