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