cellの場合の書き方がわかりません
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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);
コードが長くなってしまい申し訳ありません。
途中までは動いたのですが、ここから書き方が分かりません。
ご教授いただきたく存じます。
0 Kommentare
Akzeptierte Antwort
Atsushi Ueno
am 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
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Convert Image Type finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!