画像内ターゲットの長さを出すにはどうすればいいですか?
3 views (last 30 days)
Show older comments
二値化された画像で、特定のベクトル方向でターゲット(白色)の最大長さを出したいです。
ベクトルについては、2×2の行列の2列目をベクトル方向にしたいと考えています。
行列から特定の列や行をベクトルにするやり方も教えていただきたいです。
ご教授いただきたいと存じます。
7 Comments
Atsushi Ueno
on 13 Nov 2022
こちらの質問も拝見しました。
正確な楕円に対する主成分分析(pca)で得られた短軸方向(第二主成分)のフェレ径は、その楕円の短軸と一致するはずです。従って、bwferet関数が出力する最小フェレ径として得ても結果としては変わりないと思います。
しかしながら、ターゲットは必ずしも正確な楕円とは限らないと想定します。その場合、主成分分析(pca)で得られた第二主成分の最大フェレ径は、必ずしも最小フェレ径と一致するとは限らないと思います。
The function imFeretDiameter computes the Feret diameter for each one of the specified directions.
(関数 imFeretDiameter は,特定された方向毎にフェレ径を計算する。)
Accepted Answer
Hernia Baby
on 14 Nov 2022
Edited: Hernia Baby
on 14 Nov 2022
コメントを見まして、先回の回答と照らし合わせながらお答えします
まずはバイナリイメージを散布データに変えられたところから始めます
clear; clc; close all
データ生成を行います
rng default
u1=5*randn(1,10000);
u2=randn(1,10000);
x1=1/2^0.5*u1+1/2^0.5*u2;
x2=1/2^0.5*u1-1/2^0.5*u2;
X=[x1 ; x2];
SVDをかけます
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'); % 直交振幅の計算
可視化します
subplot(1,2,1);
plot(X(1,:),X(2,:),'.', ...
Values(1,1)*[0 ; Vectors(1,1)], ...
Values(1,1)*[0 ; Vectors(2,1)],'m', ...
Values(1,1)*[0 ; Vectors(1,2)], ...
Values(1,1)*[0 ; Vectors(2,2)],'g');
daspect([1 1 1]);
xlim([-20 20]); ylim([-20 20]);
title('Original Data');
subplot(1,2,2);
plot(Amplitudes(1,:),Amplitudes(2,:),'r.');
daspect([1 1 1]);
xlim([-20 20]); ylim([-20 20]);
title('Orthognal Amplitudes');
------------------------------------------------------------------------
上記までが先回のおさらいになります
以下が第二主軸での長さを出す順です
ここで第二主軸の幅を0.15以内に絞って見てみます
idx = abs(Amplitudes(1,:)) <= 0.15; % 第一主軸0.15のバラツキを許容
Amp1 = Amplitudes(1,idx); % 0.15 内の横軸
Amp2 = Amplitudes(2,idx); % 0.15 内の縦軸
Amp2Max = max(Amp2); % 縦軸上の最大値
Amp2Min = min(Amp2); % 縦軸上の最小値
DAmp2 = Amp2Max - Amp2Min % 最大 - 最小
参考までに可視化を行います
Amp1Max = Amp1(Amp2 == Amp2Max);
Amp1Min = Amp1(Amp2 == Amp2Min);
figure
plot(Amplitudes(1,:),Amplitudes(2,:),'r.');
daspect([1 1 1]);
xlim([-20 20]); ylim([-20 20]);
title('Orthognal Amplitudes');
hold on
xline(0)
% scatter(Amp1,Amp2,10,'ko','filled');
scatter(Amp1Max, Amp2Max,20, 'bo', 'filled')
scatter(Amp1Min, Amp2Min,20, 'bo', 'filled')
text(Amp1Max + 1, Amp2Max + 2, sprintf('Max(%0.3f,%0.3f)',Amp1Max, Amp2Max))
text(Amp1Min + 1, Amp2Min - 2, sprintf('Min(%0.3f,%0.3f)',Amp1Min, Amp2Min))
4 Comments
Hernia Baby
on 15 Nov 2022
おそらく行と列が逆なので転置をかける必要があります
X = [x1, x2];
size(X)
% 転置
X = X';
size(X)
上記のようにして確認してみてください
More Answers (0)
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!