仿射变换重新缩放

McM*_*cMa 5 math matlab opencv image-processing affinetransform

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

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

Chol=[a,b           
      0,c]
Run Code Online (Sandbox Code Playgroud)

a,[0,1]中的c和[-1,1]中的b(对于那些感兴趣的人,它是检测到的区域的协方差矩阵的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) 
Run Code Online (Sandbox Code Playgroud)

我得到一个未缩放的图像,转换和图像大小:  图像无效,转换和图像大小.

我真正想要的是 - 并且通过这条线的试错来实现这个特定的框架

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

看起来像这样:

想!.

我知道问题在于缩放S,XY.如果有人知道如何计算这个,你将节省我回到学校几何的漫长旅程!(我已经拥有了可以从第二个图像时刻中提取的所有几何信息,如市长和短轴,各自的幅度,偏心率等等.)

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

Chol = 0.43  -0.23
       0      0.67
Run Code Online (Sandbox Code Playgroud)

这个想法我有XY:与LW主轴线和次轴线的大小(变化很大,这取决于形状通常约5和50):

X=(1+L/(L+W));
Y=(1+W/(L+W));
Run Code Online (Sandbox Code Playgroud)

仅当剪切Chol不大时才有效.S取决于形状,在5到30之间做得很好.

McM*_*cMa 1

恐怕没有办法绕过一些简单的数学(这也不是那么困难......)!

从我们的变换矩阵

Chol=L1 L2
     0  L3
Run Code Online (Sandbox Code Playgroud)

Chol=Sc*Sh*Rot是缩放、剪切和旋转的枚举

Sc=Sx 0  ,  Sh=1 m  , Rot= cos(alpha)  sin(alpha)   
   0  Sy       0 1         -sin(alpha) cos(alpha)
Run Code Online (Sandbox Code Playgroud)

如下alpha=0

L1=Sx , L2=m*Sx , L3=Sy , m=L1/L2.
Run Code Online (Sandbox Code Playgroud)

要重新缩放变换,请使用最高缩放因子的倒数Sy or Sx

%MatLab
CholScale=Chol*[1/max(Chol(1,1),Chol(2,2)),0;0,1/max(Chol(1,1),Chol(2,2))];
Run Code Online (Sandbox Code Playgroud)

并重新缩放图像,记下极值的变换:

 xmax'=xmax*Sx+m*ymax
 ymax'=ymax*Sy
Run Code Online (Sandbox Code Playgroud)

在我的代码中看起来像这样

%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))]); 
Run Code Online (Sandbox Code Playgroud)

瞧!

在此输入图像描述