使用Matlab的主成分分析(PCA)进行主成分计算和绘图

3
我有一张图片,需要确定图像方差最小的轴。经过一些阅读和搜索,我得出结论,主成分分析(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)),[])

嗨,我会更新问题。 - user2307268
啊,好的。那么我的理解是你有一组坐标,想要将这些坐标重新投影到基向量上以消除旋转?从你的图表中并不十分清楚。此外,提供一些代码和/或原始图像肯定会有助于解决你的问题。现在,我什么也做不了。 - rayryeng
此外,您可以使用 regionprops 确定方向角度,然后简单地应用 imrotate 以相反的方向旋转图像。无需直接使用 PCA。 - rayryeng
你的形状似乎会受到3D旋转的影响,是吗? - rayryeng
1
@krisdestruction - 哈哈,不用担心。你的帖子写得很好。加一。 - rayryeng
显示剩余17条评论
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

谢谢,我想我还需要更多的工作和理解。完成后我会给您更新的。再次感谢。 - user2307268
没问题,如果正确请接受,如果需要更改请告诉我! - krisdestruction
既然你问了,你可以使用上述代码绘制轴线,但那通常更适用于更高的维度(例如我的是1000个维度)。 - krisdestruction
嗨,我通過主成分分析(PCA)了解了一些。我能直接在圖像上應用PCA嗎,還是需要重新結構它? - user2307268
那取决于您要捕捉的方差。如果您想获得相邻x-y像素的最大方差,您将需要提取相邻像素值。不管您想采取什么方法,您都需要将您想要捕获的方差维度放入特征向量中,每个样本数据集表示一行,每个您正在测量的维度中的特征值表示一列。 - krisdestruction

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接