仿射变换重新缩放

时间:2014-08-05 12:02:30

标签: matlab opencv math image-processing affinetransform

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

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

Chol=[a,b           
      0,c]

a中的c,[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) 

我得到一个未缩放的图像,转换和图像大小: image unsacled in both, the transformation and the image size

我真正想要的是 - 并且只通过此行的反复试验来实现此特定框架

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之间做得很好,具体取决于形状。

1 个答案:

答案 0 :(得分:0)

恐怕没有办法解决一些简单的数学问题(也不是那么困难......)!

来自我们的转型矩阵

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 or 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