- 画像を n 枚集めます。画像のピクセルを1行に並べて X とします
- 行ベクトルは平均 0 になるようにしなくても pca でやってくれます。
- 以下を実行:
二値化画像から主成分分析するにはどうしたらよいですか?
16 ビュー (過去 30 日間)
古いコメントを表示
二値化された画像の白部分に対して主成分分析をしたいです。
流れとしては、白部分1ピクセルごとの座標を取得して、それをもとに主成分分析を行い、第一主軸、第二主軸まで出すことを考えています。
また、第一主軸、第二主軸の長さも出したいと考えています。
座標取得のやり方から分からないので、ご教授頂きたいと存じます。
0 件のコメント
採用された回答
Hiro Yoshino
2022 年 11 月 1 日
主成分分析 / KL 変換 はデータの集合に対して、その集合の情報量 (分散) が大きくなる部分空間 (基底) を順番に探していく手法ですので、画像一枚からではそれは求まりません。画像を沢山あつめて、その画像から基底となる画像を見つけるイメージです。
ここではやり方だけ示しておきます。
[coeff,score,latent] = pca(X)
これで得られた、coeff が X の分散共分散行列の固有値で、PCF loadingとか因果負荷量と呼ばれる物です。これが先の基底に相当します。固有値が大きい順(影響が大きい順) に並んでいるはずです。score がこの部分空間中での元の画像の座標を示しているので、score と coeff の線形結合で元の画像に復元されます。
基本的に固有ベクトルは長さ1に正規化されるので、主軸の長さの議論は意味が有りません。主軸に画像を射影したときの長さが、coeff に対応しています。
pca の計算 (固有ベクトルの計算) に使っていない画像データも
img'*score(1,:) % 第一主軸の成分を抽出
こんな感じで、内積をとってあげれば 主軸の score (成分) を得ることが出来ます。
画像の注目するとこだけ抜き出す一般的な方法(画像処理の流れ)を以下に示しておきます:
I = imread('coins.png');
%BW=imbinarize(I); % そのままやると輝度によって綺麗に取れない
BW = bwareaopen(I>80,100); % モルフォロジー処理
imshowpair(I,BW,"montage");
% 余計な場所を削除
IoI = I;
IoI(~BW)=0;
imshow(IoI)
6 件のコメント
Hiro Yoshino
2022 年 11 月 2 日
分散共分散行列を使って計算するよりもsvd の方が計算が速いので、恐らく pca でも行列サイズによっては内部的に svd が動いていると思います。若干用途は異なりますが、非常に似た考え方で、兄弟と思っても良いです。
2つは同じでは無いですが、主成分を抽出すると言う点では同じです。
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!