3

我有一个图像。我需要确定图像方差最小的轴。一些阅读和搜索使我得出结论,主成分分析(PCA)是最好的选择。任何人都可以帮助我根据其主轴定位图像吗?由于我最近被介绍给 matlab,我发现它有点困难。图像示例如下。我正在尝试旋转图像以便生成直方图。

在此处输入图像描述

我还没有使用 PCA,因为我当前的代码如下所示

enter code here
I2='image'
I11= bwlabel(I2);
OBB = imOrientedBox(I11);
obbsize=[];
for i=1:size(OBB,1)
   obbsize=[obbsize,OBB(i,3)*OBB(i,4)];
end
[a,i]=max(obbsize);
I11=(imrotate(I2,OBB(i,5)));
imshow(I11,[])

[pks,locs] =findpeaks(sum(I11,2));
[M1,Indx1] = max(pks);
imshow(I11(1:locs(Indx1),1:size(I11,2)),[])
4

1 回答 1

2

使用构建您的 PCA 转换矩阵。C 是你的变换或旋转矩阵,它将把它变换到你的最高方差方向。

[C,~,~,~,explained] = pca( data );

如果您希望截断组件(例如 1-5 个组件),请移除 PC。如果您不需要截断/减少维度,请忽略此步骤。

C = C(:,1:5);

使用转换创建转换后的数据C。数据现在将位于新的转换空间中,第一维是最大方差,第二个暗淡是第二大方差,依此类推。由于您正在寻找最小方差,即最后一

tfData = data * C;

在这个新的转换空间中相应地处理您的数据。要获得您的逆变换并将其放回原始空间,请使用以下内容。

origAxisData = tfData * C';

转置操作与逆变换C'的逆操作相同,inv(C)因为它是正交的,如此处所述。然而,转置比逆计算要快得多,特别是对于高维度。

您可以通过绘制 C 的列来绘制主成分/轴/内核,如下所示。

for i = 1:length(end)
    figure; plot( C(:,1) );
end
于 2015-04-24T16:42:03.120 回答