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 );

コンポーネントを切り詰める場合は、PC を削除します (たとえば、1 ~ 5 コンポーネント)。寸法を切り捨てる/削減する必要がない場合は、この手順を無視してください。

C = C(:,1:5);

変換を使用して、変換されたデータを作成しますCデータは、最初の次元が最大の分散、2番目の次元が2 番目に大きい分散など、新しい変換された空間になります。最小の分散を探しているので、それが最後の次元です。

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 に答える