【问题标题】:Find enclosing rectangle of image object using second moments使用第二矩找到图像对象的封闭矩形
【发布时间】: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


【解决方案1】:

计算标准化二阶中心矩后,您会得到如下矩阵:

| 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

对于“最佳”的某些定义,可以将其视为最佳拟合椭圆

我们无法确定这些值的任意形状的大小,但如果我们知道我们的形状是一个矩形,那么我们可以通过知道二维矩形的惯性矩来确定它的大小(参见@987654322 @):

| 1/12 m h^2       0     |
|      0      1/12 m w^2 |

m 是质量,在我们的例子中是 1,因为我们已经对矩进行了归一化。

因此,

w = sqrt(12*l1);
h = sqrt(12*l2);

这给了我们w = 100.9950h = 200.9975 用于 OP 中的案例。

【讨论】:

  • 非常有帮助,谢谢!如果我们确实有一个任意形状,并且目标是,比如说,在一个对象周围画一个封闭的矩形。最好的方法是使用最佳拟合椭圆的半径吗?再次感谢您的出色回答。
  • @mash:找到边界矩形的最简单方法是找到最小和最大 x 和 y 坐标。这也比计算时刻便宜得多。迭代图像,对于您记录的每个对象像素minx = min(minx,x); maxx = max(maxx,x); 和该像素的 y 坐标相同。这导致定义矩形的两个角:(minx,miny), (maxx,maxy).
  • 我真的只是在学习和试验高阶时刻。最后一个问题,如果我知道我的形状是一个圆形,那么根据您发布的 3D 长方体链接对于圆形 a Ix = 1/2 mr^2 我可以找到类似 r = sqrt(2 * L1 )?是的,您对迭代和查找 min(x) 等是正确的……这要容易得多,这也是我通常做的事情。再次感谢
  • @mash:圆不实,你要看看盘。但是 3D 中 2D 形状的时刻与 2D 世界中的时刻不同。圆只是一个带有a==b 的椭圆,所以你得到r = 2*sqrt(l1),正如我在答案中指出的那样(直径由sqrt(16*l1) 给出)。
猜你喜欢
  • 2020-06-25
  • 1970-01-01
  • 2020-01-09
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多