【发布时间】:2021-05-24 07:22:15
【问题描述】:
我的理解是第二个中心时刻应该给我一个对象的方差。我应该能够将其用作对象中心像素分布的度量,因此我认为我可以使用第二个矩找到对象的封闭矩形的大小。 假设在 Malab 中,我创建了一个尺寸为 100x200 的白色矩形的图像,并使用第一时刻找到质心,然后我计算方差
im = zeros(501,400);
im(200:300,100:300) = ones(101,201);
%Sum the moments in a for loop for clarity
for v = 1:rows
for u = 1:cols
val = im(v,u);
%zeroth moment is just the total pixel count
m00 = m00 + val;
%First moments. pixel value times position is the m10 and m01
m01 = m01 + (val * v);
m10 = m10 + (val * u);
end
end
%centers of mass
uc = m10/m00;
vc = m01/m00;
%Now I find the second central moments wrt centroid
for v = 1:rows
for u = 1:cols
val = im(v,u);
u02 = u02 + (v - vc)^2 * val;
u20 = u20 + (u - uc)^2 * val;
end
end
hold on;
plot(uc,vc, 'r+');
text(uc + 5,vc + 5,strcat('X:',num2str(uc)),'Color','green','FontSize',12);
text(uc + 5,vc + 20,strcat('Y:',num2str(vc)),'Color','green','FontSize',12);
我对 u02 的值是 17255850,其平方根是 4154。有没有办法可以使用方差直接得到矩形的近似大小?感谢您的帮助。
编辑:尝试使用协方差矩阵拟合椭圆,并尝试使用 cmets 中讨论的方差计算大小,我得到下图。黄色矩形的尺寸是用
计算的 %can we estimate size based on standard deviation?
stdX = sqrt(u20/m00);
stdY = sqrt(u02/m00);
rectangle('Position',[uc-2*stdX vc-2*stdY 4*stdX 4*stdY],'EdgeColor','yellow');
【问题讨论】:
-
不,一般来说不是。您只能获得“最佳拟合”椭圆的大小。这取决于对象的形状,椭圆如何转换为最小的封闭框。如果你知道你的对象是一个实心矩形,你可以从二阶矩计算它的大小。
-
谢谢,我正在使用协方差矩阵尝试最适合的椭圆,效果很好。但是试图从简单形状(如圆形和矩形)的二阶矩计算大小,只是想明白。要从二阶矩中获取大小,我会采用上面的代码并添加 sqrt(u20/m00) 不会给我 x 方向的标准偏差吗?然后估计一个封闭的矩形为 uc +/- 2 * stdev?我猜这取决于像素是否服从正态分布?
-
矩形不是 +/- 2 标准差。方差是 1/12 width^2,所以 width=sqrt(12*u20/m00) 或类似的东西。让我查一下并发布一个实际的答案。
标签: matlab image-processing computer-vision linear-algebra