二値化画像から主成分​分析するにはどうした​らよいですか?

14 visualizzazioni (ultimi 30 giorni)
R
R il 1 Nov 2022
Commentato: R il 2 Nov 2022
二値化された画像の白部分に対して主成分分析をしたいです。
流れとしては、白部分1ピクセルごとの座標を取得して、それをもとに主成分分析を行い、第一主軸、第二主軸まで出すことを考えています。
また、第一主軸、第二主軸の長さも出したいと考えています。
座標取得のやり方から分からないので、ご教授頂きたいと存じます。

Risposta accettata

Hiro Yoshino
Hiro Yoshino il 1 Nov 2022
主成分分析 / KL 変換 はデータの集合に対して、その集合の情報量 (分散) が大きくなる部分空間 (基底) を順番に探していく手法ですので、画像一枚からではそれは求まりません。画像を沢山あつめて、その画像から基底となる画像を見つけるイメージです。
ここではやり方だけ示しておきます。
  1. 画像を n 枚集めます。画像のピクセルを1行に並べて X とします
  2. 行ベクトルは平均 0 になるようにしなくても pca でやってくれます。
  3. 以下を実行:
[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 Commenti
Hiro Yoshino
Hiro Yoshino il 2 Nov 2022
@R すみません、タイミングの問題で @Hernia Baby さんと被ってしまいましたが、svd でも理論的には同じ固有ベクトルを獲得出来ます。
分散共分散行列を使って計算するよりもsvd の方が計算が速いので、恐らく pca でも行列サイズによっては内部的に svd が動いていると思います。若干用途は異なりますが、非常に似た考え方で、兄弟と思っても良いです。
2つは同じでは無いですが、主成分を抽出すると言う点では同じです。
R
R il 2 Nov 2022
お二方ともありがとうございます。
とても詳しく説明があり、分かりやすいです。
どちらも参考にし、試してみたいと思います。

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Eigenvalues in Help Center e File Exchange

Prodotti


Release

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!