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

2 次查看(过去 30 天)
R
R 2022-11-18
评论: R 2022-11-19
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);
コードが長くなってしまい申し訳ありません。
途中までは動いたのですが、ここから書き方が分かりません。
ご教授いただきたく存じます。

采纳的回答

Atsushi Ueno
Atsushi Ueno 2022-11-19
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 个评论
R
R 2022-11-19
ご回答ありがとうございます。
動かすことができました。

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Convert Image Type 的更多信息

标签

产品


版本

R2022b

Community Treasure Hunt

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

Start Hunting!