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

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

Accepted Answer

Hiro Yoshino
Hiro Yoshino on 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 Comments
Hiro Yoshino
Hiro Yoshino on 2 Nov 2022
@R すみません、タイミングの問題で @Hernia Baby さんと被ってしまいましたが、svd でも理論的には同じ固有ベクトルを獲得出来ます。
分散共分散行列を使って計算するよりもsvd の方が計算が速いので、恐らく pca でも行列サイズによっては内部的に svd が動いていると思います。若干用途は異なりますが、非常に似た考え方で、兄弟と思っても良いです。
2つは同じでは無いですが、主成分を抽出すると言う点では同じです。
R
R on 2 Nov 2022
お二方ともありがとうございます。
とても詳しく説明があり、分かりやすいです。
どちらも参考にし、試してみたいと思います。

Sign in to comment.

More Answers (0)

Categories

Find more on Eigenvalues in Help Center and File Exchange

Products


Release

R2020b

Community Treasure Hunt

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

Start Hunting!