الحوسبة كائن الإحصاءات من الثانية لحظات المركزية
-
19-09-2019 - |
سؤال
أنا أعمل حاليا على كتابة نسخة MATLAB RegionProps وظيفة غنو اوكتاف.لدي أكثر من ذلك تنفيذها, ولكن أنا لا تزال تكافح مع تنفيذ أجزاء قليلة.كان طرحت سابقا عن الثاني وسط لحظات من المنطقة.
هذا كان مفيدا من الناحية النظرية, ولكن أواجه مشكلة في الواقع تنفيذ الاقتراحات.أنا الحصول على نتائج مختلفة إلى حد كبير من MATLAB (أو الحس السليم في هذا الشأن) و حقا لا أفهم لماذا.
النظر في هذا الاختبار صورة:
يمكننا أن نرى أنه يميل 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]);
نصائح أخرى
هل أنت متأكد من جوهرك raw_moments
وظيفة؟ قد تحاول
amount = ((x-1) ** i) * ((y-1) ** j) * im(y,x);
هذا لا يبدو كافيا للتسبب في المشاكل التي تراها، ولكنها قد تكون جزءا على الأقل.