سؤال

أنا أعمل حاليا على كتابة نسخة MATLAB RegionProps وظيفة غنو اوكتاف.لدي أكثر من ذلك تنفيذها, ولكن أنا لا تزال تكافح مع تنفيذ أجزاء قليلة.كان طرحت سابقا عن الثاني وسط لحظات من المنطقة.

هذا كان مفيدا من الناحية النظرية, ولكن أواجه مشكلة في الواقع تنفيذ الاقتراحات.أنا الحصول على نتائج مختلفة إلى حد كبير من MATLAB (أو الحس السليم في هذا الشأن) و حقا لا أفهم لماذا.

النظر في هذا الاختبار صورة:

Slanting ellipse.

يمكننا أن نرى أنه يميل 45 درجة من المحور X ، مع قاصر محاور رئيسية من 30 و 100 على التوالي.

تشغيل من خلال MATLAB هو RegionProps وظيفة يؤكد هذا:

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

وفي الوقت نفسه لا تحصل حتى على محاور صحيح.أحاول استخدام هذه الصيغ من ويكيبيديا.

قانون بلدي حتى الآن هو:

raw_moments.م:

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.م:

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

لست متأكدا ما أفعله خطأ.يبدو أنني بعد تلك الصيغ بشكل صحيح ولكن النتائج هي هراء.لم أجد أي أخطاء واضحة في لحظة الوظائف ، على الرغم بصراحة فهمي لحظات ليست أعظم لتبدأ.

يمكن لأي شخص رؤية أين أنا ذاهب في ضلال?شكرا جزيلا لك.

هل كانت مفيدة؟

المحلول

تحرير:

وفقا ويكيبيديا:

على eignevalues [...] هي النسبي إلى مربع طول eigenvector محاور.

الذي أوضح:

axisLength = 4 * sqrt(eigenValue)

هو مبين أدناه هو لي نسخة من الكود (أنا vectorized لحظات الوظائف):

my_regionprops.م

function props = my_regionprops(im)
    cm00 = central_moments(im, 0, 0);
    up20 = central_moments(im, 2, 0) / cm00;
    up02 = central_moments(im, 0, 2) / cm00;
    up11 = central_moments(im, 1, 1) / cm00;

    covMat = [up20 up11 ; up11 up02];
    [V,D] = eig( covMat );
    [D,order] = sort(diag(D), 'descend');        %# sort cols high to low
    V = V(:,order);

    %# D(1) = (up20+up02)/2 + sqrt(4*up11^2 + (up20-up02)^2)/2;
    %# D(2) = (up20+up02)/2 - sqrt(4*up11^2 + (up20-up02)^2)/2;

    props = struct();
    props.MajorAxisLength = 4*sqrt(D(1));
    props.MinorAxisLength = 4*sqrt(D(2));
    props.Eccentricity = sqrt(1 - D(2)/D(1));
    %# props.Orientation = -atan(V(2,1)/V(1,1)) * (180/pi);      %# sign?
    props.Orientation = -atan(2*up11/(up20-up02))/2 * (180/pi);
end

function cmom = central_moments(im,i,j)
    rawm00 = raw_moments(im,0,0);
    centroids = [raw_moments(im,1,0)/rawm00 , raw_moments(im,0,1)/rawm00];
    cmom = sum(sum( (([1:size(im,1)]-centroids(2))'.^j * ...
                     ([1:size(im,2)]-centroids(1)).^i) .* im ));
end

function outmom = raw_moments(im,i,j)
    outmom = sum(sum( ((1:size(im,1))'.^j * (1:size(im,2)).^i) .* im ));
end

...و كود الاختبار:

الاختبار.م

I = imread('135deg100by30ell.png');
I = logical(I);

>> p = regionprops(I, {'Eccentricity' 'MajorAxisLength' 'MinorAxisLength' 'Orientation'})
p = 
    MajorAxisLength: 101.34
    MinorAxisLength: 32.296
       Eccentricity: 0.94785
        Orientation: -44.948

>> props = my_regionprops(I)
props = 
    MajorAxisLength: 101.33
    MinorAxisLength: 32.275
       Eccentricity: 0.94792
        Orientation: -44.948

%# these values are by hand only ;)
subplot(121), imshow(I), imdistline(gca, [17 88],[9 82]);
subplot(122), imshow(I), imdistline(gca, [43 67],[59 37]);

screenshot

نصائح أخرى

هل أنت متأكد من جوهرك raw_moments وظيفة؟ قد تحاول

amount = ((x-1) ** i) * ((y-1) ** j) * im(y,x);

هذا لا يبدو كافيا للتسبب في المشاكل التي تراها، ولكنها قد تكون جزءا على الأقل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top