我有一张图片。我需要确定图像方差最小的轴。通过一些阅读和搜索,我得出结论:主成分分析(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)),[])
答案 0 :(得分:2)
使用构建您的PCA转换矩阵。 C是您的变换或旋转矩阵,它会将其转换为最高的方差方向。
[C,~,~,~,explained] = pca( data );
如果要截断组件(例如1-5个组件),请删除PC。如果您不需要截断/缩小尺寸,请忽略此步骤。
C = C(:,1:5);
使用转换C
创建转换后的数据。数据现在将在新的转换空间中,第一维度为最大方差,第二 dim为第二大< / strong>差异等因为您正在寻找最小方差,即最后维度
tfData = data * C;
在这个新的转换空间中相应地处理您的数据。要获得逆转换并将其放回原始空间,请使用以下命令。
origAxisData = tfData * C';
转置操作C'
与逆转换的逆操作inv(C)
相同,因为它是正交as described here。然而,转置计算的速度比反转要快得多,特别是对于高维度。
您可以通过绘制C的列来绘制主要组件/轴/内核,如下所示。
for i = 1:length(end)
figure; plot( C(:,1) );
end