画像内ターゲットの長​さを出すにはどうすれ​ばいいですか?

1 回表示 (過去 30 日間)
R
R 2022 年 11 月 12 日
コメント済み: R 2022 年 11 月 15 日
二値化された画像で、特定のベクトル方向でターゲット(白色)の最大長さを出したいです。
ベクトルについては、2×2の行列の2列目をベクトル方向にしたいと考えています。
行列から特定の列や行をベクトルにするやり方も教えていただきたいです。
ご教授いただきたいと存じます。
  7 件のコメント
Atsushi Ueno
Atsushi Ueno 2022 年 11 月 13 日
こちらの質問も拝見しました。
正確な楕円に対する主成分分析(pca)で得られた短軸方向(第二主成分)のフェレ径は、その楕円の短軸と一致するはずです。従って、bwferet関数が出力する最小フェレ径として得ても結果としては変わりないと思います。
しかしながら、ターゲットは必ずしも正確な楕円とは限らないと想定します。その場合、主成分分析(pca)で得られた第二主成分の最大フェレ径は、必ずしも最小フェレ径と一致するとは限らないと思います。
一方、回答した方法の説明には下記の説明があります。単に特定の方向のフェレ径が得られると解釈します。
The function imFeretDiameter computes the Feret diameter for each one of the specified directions.
(関数 imFeretDiameter は,特定された方向毎にフェレ径を計算する。)
R
R 2022 年 11 月 13 日
ご指摘の通りです。
実際は楕円では無いため特定の方向で長さを出したいです。
試してみたいと思います。

サインインしてコメントする。

採用された回答

Hernia Baby
Hernia Baby 2022 年 11 月 14 日
編集済み: Hernia Baby 2022 年 11 月 14 日
コメントを見まして、先回の回答と照らし合わせながらお答えします
まずはバイナリイメージを散布データに変えられたところから始めます
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 % 最大 - 最小
DAmp2 = 5.4631
参考までに可視化を行います
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 件のコメント
Hernia Baby
Hernia Baby 2022 年 11 月 15 日
おそらく行と列が逆なので転置をかける必要があります
X = [x1, x2];
size(X)
% 転置
X = X';
size(X)
上記のようにして確認してみてください
R
R 2022 年 11 月 15 日
ありがとうございます。
解決しました。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

製品


リリース

R2022b

Community Treasure Hunt

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

Start Hunting!