使用二阶矩查找图像对象的外接矩形
Find enclosing rectangle of image object using second moments
我的理解是第二中心矩应该给我一个对象的方差。我应该能够将其用作距离对象中心的像素分布的度量,因此我认为我可以使用二次矩找到对象的封闭矩形的大小。
说在 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。有没有办法可以直接使用方差得到矩形的近似大小?感谢您的帮助。
编辑:尝试使用协方差矩阵拟合椭圆并尝试使用评论中讨论的方差计算大小,我得到了下图。黄色矩形的尺寸是用
计算的
%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');
计算完归一化二阶中心矩后,您将得到如下矩阵:
| u20/m00 u11/m00 |
| u11/m00 u02/m00 |
该矩阵的两个特征值提供了对象尺寸的旋转不变度量。
%Normalized second order central moment tensor
mu = [u02/m00, u11/m00; u11/m00, u20/m00];
%The eigenvalues relate to the size
[V,D] = eig(mu);
l1 = D(1,1);
l2 = D(2,2);
%The eigenvectors relate to the orientation
phi = atan2(V(1,2),V(1,1));
给定特征值,我们可以确定具有相同归一化二阶中心矩的椭圆的半径:
a = 2*sqrt(l1);
b = 2*sqrt(l2);
请注意,这仅适用于 a solid ellipse。
可以认为这是最适合的椭圆,对于“最佳”的某些定义。
我们无法确定这些值的任意形状的大小,但如果我们知道我们的形状是一个矩形,那么我们可以通过知道二维矩形的惯性矩为(请参阅Wikipedia, compare moments of 3D cuboid):
| 1/12 m h^2 0 |
| 0 1/12 m w^2 |
其中 m
是质量,在我们的例子中是 1,因为我们已经对力矩进行了标准化。
因此,
w = sqrt(12*l1);
h = sqrt(12*l2);
这为 OP 中的案例提供了 w = 100.9950
和 h = 200.9975
。
我的理解是第二中心矩应该给我一个对象的方差。我应该能够将其用作距离对象中心的像素分布的度量,因此我认为我可以使用二次矩找到对象的封闭矩形的大小。 说在 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。有没有办法可以直接使用方差得到矩形的近似大小?感谢您的帮助。
编辑:尝试使用协方差矩阵拟合椭圆并尝试使用评论中讨论的方差计算大小,我得到了下图。黄色矩形的尺寸是用
计算的 %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');
计算完归一化二阶中心矩后,您将得到如下矩阵:
| u20/m00 u11/m00 |
| u11/m00 u02/m00 |
该矩阵的两个特征值提供了对象尺寸的旋转不变度量。
%Normalized second order central moment tensor
mu = [u02/m00, u11/m00; u11/m00, u20/m00];
%The eigenvalues relate to the size
[V,D] = eig(mu);
l1 = D(1,1);
l2 = D(2,2);
%The eigenvectors relate to the orientation
phi = atan2(V(1,2),V(1,1));
给定特征值,我们可以确定具有相同归一化二阶中心矩的椭圆的半径:
a = 2*sqrt(l1);
b = 2*sqrt(l2);
请注意,这仅适用于 a solid ellipse。
可以认为这是最适合的椭圆,对于“最佳”的某些定义。
我们无法确定这些值的任意形状的大小,但如果我们知道我们的形状是一个矩形,那么我们可以通过知道二维矩形的惯性矩为(请参阅Wikipedia, compare moments of 3D cuboid):
| 1/12 m h^2 0 |
| 0 1/12 m w^2 |
其中 m
是质量,在我们的例子中是 1,因为我们已经对力矩进行了标准化。
因此,
w = sqrt(12*l1);
h = sqrt(12*l2);
这为 OP 中的案例提供了 w = 100.9950
和 h = 200.9975
。