cellの場合の書き方がわかりません
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
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 comentarios
Respuesta aceptada
Atsushi Ueno
el 19 de Nov. de 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
Más respuestas (0)
Ver también
Categorías
Más información sobre Convert Image Type en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!