使用Matlab中的主成分分析(PCA)计算和绘制主成分

时间:2015-04-24 15:09:04

标签: matlab image-processing computer-vision pca principal-components

我有一张图片。我需要确定图像方差最小的轴。通过一些阅读和搜索,我得出结论:主成分分析(PCA)是最佳选择。任何人都可以帮我定位关于其主轴的图像吗?由于我最近被介绍到matlab,我发现它有点困难。图像的示例如下。我试图旋转图像,以便我可以生成直方图。

enter image description here

我还没有使用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)),[])

1 个答案:

答案 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