Big*_*gle 6 matlab image-processing octave computer-vision
我正在为GNU Octave编写一个MATLAB RegionProps函数版本.我已经完成了大部分工作,但我仍然在努力实现一些部分.我之前曾询问过一个地区的第二个中心时刻.
这在理论上是有帮助的,但我实际上在实施这些建议时遇到了麻烦.我得到的结果与MATLAB(或者常识)的结果大不相同,真的不明白为什么.
考虑这个测试图像:

我们可以看到它与X轴成45度倾斜,次轴和长轴分别为30和100.
通过MATLAB的RegionProps功能运行它确认了这一点:
MajorAxisLength: 101.3362
MinorAxisLength: 32.2961
Eccentricity: 0.9479
Orientation: -44.9480
Run Code Online (Sandbox Code Playgroud)
与此同时,我甚至没有让轴正确.我正在尝试使用维基百科中的这些公式.
到目前为止我的代码是:
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;
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
这是我的代码试图使用这些.我在每个步骤中都包含了对值的注释:
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
Run Code Online (Sandbox Code Playgroud)
我不确定我做错了什么.我似乎正确地遵循这些公式,但我的结果是无稽之谈.我没有在我的时刻功能中发现任何明显的错误,但老实说,我对时刻的理解并不是最开始的.
谁能看到我误入歧途的地方?非常感谢你.
Amr*_*mro 10
根据维基百科:
eignevalues [...] 与特征向量轴的平方长度成正比.
解释如下:
axisLength = 4 * sqrt(eigenValue)
Run Code Online (Sandbox Code Playgroud)
下面显示的是我的代码版本(我将时刻函数向量化):
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
Run Code Online (Sandbox Code Playgroud)
...以及测试它的代码:
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]);
Run Code Online (Sandbox Code Playgroud)
