我在执行一系列操作的图像中检测到一个显着区域,最重要的是仿射归一化(将椭圆转换为圆形,将梯形转换为等边矩形)。
仿射归一化是矩阵中剪切和缩放的组合,如下所示:
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]);
看起来像这样:
.
我知道问题出在 S
、X
和 Y
的缩放中。如果有人知道如何计算这个,你将节省我回到学校几何学的漫长旅程! (我已经拥有可以从第二个图像时刻提取的所有几何信息,例如长轴和短轴以及各自的大小、偏心率等。)
编辑:一些典型值(不一定是这种情况):
Chol = 0.43 -0.23
0 0.67
我对 X
和 Y
的想法:L
和 W
主要和短轴(根据形状变化很大,通常在 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))]);
瞧!
关于matlab - 仿射变换缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25138357/