Estatísticas de objetos de computação dos segundos momentos centrais

Atualmente estou trabalhando em escrever uma versão do MATLABRegionProps função paraOitava GNU. Eu tenho a maioria implementada, mas ainda estou lutando com a implementação de algumas partes. eu tinhapreviamente perguntado sobre asegundos momentos centrais de uma região.

Isso foi útil teoricamente, mas estou tendo problemas para implementar as sugestões. Eu tenho resultados muito diferentes dos do MATLAB (ou do senso comum) e realmente não entendo o porquê.

Considere esta imagem de teste:

Podemos ver que inclina a 45 graus do eixo X, com eixos menores e maiores de 30 e 100, respectivamente.

Executando-o através do MATLABRegionProps função confirma isso:

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

Enquanto isso, eu nem entendo os eixos direito. Estou tentando usarestas fórmulas da Wikipedia.

Meu código até agora é:

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

E aqui está meu código tentando usar isso. Incluo comentários para os valores que recebo em cada etapa:

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

Não tenho certeza do que estou fazendo de errado. Eu pareço estar seguindo essas fórmulas corretamente, mas meus resultados são um absurdo. Não encontrei nenhum erro óbvio em minhas funções momentâneas, embora, sinceramente, minha compreensão dos momentos não seja a melhor para começar.

Alguém pode ver onde estou me desviando? Muito obrigado.

questionAnswers(2)

yourAnswerToTheQuestion