我在图像中检测到一个显着区域,我执行了一系列操作,最重要的是仿射归一化(将椭圆转换为圆形,将梯形转换为等边矩形)。
仿射归一化是矩阵中剪切和缩放的组合,如下所示:
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)
我得到一个未缩放的图像,转换和图像大小:。
我真正想要的是 - 并且只通过此行的反复试验来实现此特定框架
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之间做得很好,具体取决于形状。
答案 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))]);
而且瞧!