仿射变换的重新缩放

5

我在图像中检测到一个显著的区域,对该区域进行了一系列操作,其中最重要的是仿射归一化(将椭圆形转换为圆形,将梯形转换为等边矩形)。

仿射归一化是剪切和缩放的组合,其矩阵如下:

Chol=[a,b           
      0,c]

当a、c在[0,1]之间,b在[-1,1]之间时(对于那些感兴趣的人来说,这是检测区域协方差矩阵的Cholesky分解的逆运算)。

一切都很顺利,但当我将变换应用到原始帧时出现问题。

AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]],... 
                          'DSize',[RealFrameSize(1),RealFrameSize(2)]);          
% that's dst=cv.warpAffine(src,trafo) with trafo: 2x3 Matrix (here Chol and [0,0] translation) 

我在变换和图像大小方面都得到了一个未缩放的图像:在变换和图像大小方面都未缩放的图像

实际上,我想要的是通过试错才能在这个特定帧中实现的目标,只有这一行代码:

AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]]*S,... 
                          'DSize',[RealFrameSize(1)*X,RealFrameSize(2)*Y]);  

看起来会像这样:

Want!.

我知道问题在于SXY的缩放。如果有人知道如何计算这个,你将为我节省一次回到学校几何的漫长旅程!(我已经提取了所有可以从第二幅图像矩中提取的几何信息,例如主轴和次轴的大小、离心率等等。)

编辑:一些典型值(不一定是这种情况):

Chol = 0.43  -0.23
       0      0.67

我对编程的想法涉及到 XY:通过 LW 来表示主轴和次轴的大小(通常在形状变化范围内大约为5到50)。
X=(1+L/(L+W));
Y=(1+W/(L+W));

仅在从Chol剪切不太大的情况下才有效。根据形状,S在5到30之间表现良好。


SXY的值是多少?您能否在示例中发布使用的Chol矩阵的值? - Shai
刚刚完成了,不是和我的例子一模一样,但应该非常相似。 - McMa
1个回答

1

我很抱歉,有些简单的数学是无法避免的(其实也不难...)!

从我们的变换矩阵中

Chol=L1 L2
     0  L3

这是一个有关缩放、剪切和旋转的枚举项,使用Chol=Sc*Sh*Rot公式表示。
Sc=Sx 0  ,  Sh=1 m  , Rot= cos(alpha)  sin(alpha)   
   0  Sy       0 1         -sin(alpha) cos(alpha)

alpha=0 时,如下:

L1=Sx , L2=m*Sx , L3=Sy , m=L1/L2.

要重新调整变换比例,您需要使用最高缩放因子Sy或Sx的倒数:

%MatLab
CholScale=Chol*[1/max(Chol(1,1),Chol(2,2)),0;0,1/max(Chol(1,1),Chol(2,2))];

要重新调整图像,请写下极值的转换:

 xmax'=xmax*Sx+m*ymax
 ymax'=ymax*Sy

在我的代码中看起来像这样。
%MatLab
AffineFrame=cv.warpAffine(RealFrame,[CholScale,[0;0]],... 
                      'DSize',[RealFrameSize(2)*(1/max(Chol(1,1),Chol(2,2))*Chol(1,1))+RealFrameSize(1)*Chol(1,2)/Chol(1,1),...
                               RealFrameSize(1)*(1/max(Chol(1,1),Chol(2,2))*Chol(2,2))]); 

就这样!

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接