matlab - 仿射变换缩放

标签 matlab opencv math image-processing affinetransform

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

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

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) 

我得到的图像在变换和图像大小方面均未缩放: 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 之间做得很好。

最佳答案

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

来 self 们的转换矩阵

Chol=L1 L2
     0  L3

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

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

关于matlab - 仿射变换缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25138357/

相关文章:

c++ - 什么是 "modf()"(来自 C/C++ 等的数学函数)的简写?

MATLAB:为图中的数据光标永久设置 "Text Update Function"

string - 检查 MATLAB 主字符串中可用的一组子字符串中的任何字符串

python-3.x - 如何使用opencv python查找图像中的最小矩形?

opencv - 筛选描述符提取器

OpenCv SVM 输出文件格式

matlab - Datetick 在绘图中没有显示足够的刻度线

algorithm - 没有预定义区间的分段函数

math - 为什么有符号字节的范围是从 -128 到 127(2 的补码)而不是从 -127 到 127?

C++ 不正确的算术结果