cellの場合の書き方がわかりません

19 views (last 30 days)
R
R on 18 Nov 2022
Commented: R on 19 Nov 2022
1枚の画像について処理してきたコードを複数枚の画像用に書き直したいです。
画像1枚に対するコード(Xのクラス double)
[row, col] = find(BW); %二値化画像から座標取得
X = [row, col];
X = X';  % 転置
X = X - mean(X,2); % 平均値を中央へシフト
[U,S,V] = svd(X); % SVD
[m, n] = size(X);
S2 = S(1:m,1:m); % 固有値
Values = S2^2/n; % 固有値
Vectors = U; % 固有ベクトル
Amplitudes = S*conj(V'); % 直交振幅の計算
idx = abs(Amplitudes(1,:)) <= 150; % 第一主軸150のバラツキを許容
Amp1 = Amplitudes(1,idx); % 150 内の横軸
Amp2 = Amplitudes(2,idx); % 150 内の縦軸
Amp2Max = max(Amp2); % 縦軸上の最大値
Amp2Min = min(Amp2); % 縦軸上の最小値
DAmp2 = Amp2Max - Amp2Min; % 最大 - 最小
複数枚画像に対するコード(Xのクラス cell)
[row, col] = cellfun(@(x) find(x),BWs,'uni',false); %二値化画像群から座標取得
X = [row, col];
X = X'; % 転置
X = cellfun(@(x) x - mean(x,2),X,'uni',false); %平均を中央値へシフト
[U,S,V] = cellfun(@(x) svd(x),X,'uni',false); % SVD
[m, n] = cellfun(@(x) size(x),X,'uni',false);
コードが長くなってしまい申し訳ありません。
途中までは動いたのですが、ここから書き方が分かりません。
ご教授いただきたく存じます。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 19 Nov 2022
1枚で動作するプログラムを関数your_functionにしてそのまま使います。イメージデータストアからreadall関数で全画像を読み込み、それをcellfun関数で1枚ずつyour_function関数に通して結果を得ます。
下記の例では複数の画像ではなく1枚しか扱っていませんが、イメージデータストアに取り込む画像枚数を増やせば、入力画像を差し替えながら全く同じ方法で処理できます。
svd関数の取り扱うイメージのサイズが大きいとエラーが発生し「エコノミーサイズの分解 svd(A,"econ") 」とする様に促されます。エコノミーサイズの処理を指定すると、S — 特異値がスカラ値になり、SとS2が同一になるなど結果が変わってくるのでご検討ください。
fs = matlab.io.datastore.FileSet(["coins.png"]); % サンプルは1枚だけ
imds = imageDatastore(fs);
I = readall(imds); % 複数画像を読み込む
BW = cellfun(@(x) imbinarize(im2gray(x)),I,'uni',false);% 二値化
[Values,Vectors,Amplitudes,DAmp2] = cellfun(@your_function,BW,'uni',false);
%%1枚の画像について処理してきたコードを関数化
function [Values,Vectors,Amplitudes,DAmp2] = your_function(BW)
[row, col] = find(BW); %二値化画像から座標取得
X = [row, col];
X = X'; % 転置
X = X - mean(X,2); % 平均値を中央へシフト
[U,S,V] = svd(X); % SVD
[m, n] = size(X);
S2 = S(1:m,1:m); % 固有値
Values = S2^2/n; % 固有値
Vectors = U; % 固有ベクトル
Amplitudes = S*conj(V'); % 直交振幅の計算
idx = abs(Amplitudes(1,:)) <= 150; % 第一主軸150のバラツキを許容
Amp1 = Amplitudes(1,idx); % 150 内の横軸
Amp2 = Amplitudes(2,idx); % 150 内の縦軸
Amp2Max = max(Amp2); % 縦軸上の最大値
Amp2Min = min(Amp2); % 縦軸上の最小値
DAmp2 = Amp2Max - Amp2Min; % 最大 - 最小
end
  1 Comment
R
R on 19 Nov 2022
ご回答ありがとうございます。
動かすことができました。

Sign in to comment.

More Answers (0)

Tags

Products


Release

R2022b

Community Treasure Hunt

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

Start Hunting!