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

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

Sign in to comment.

Accepted Answer

Hernia Baby
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 % 最大 - 最小
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 Comments
Hernia Baby
Hernia Baby on 15 Nov 2022
おそらく行と列が逆なので転置をかける必要があります
X = [x1, x2];
size(X)
% 転置
X = X';
size(X)
上記のようにして確認してみてください
R
R on 15 Nov 2022
ありがとうございます。
解決しました。

Sign in to comment.

More Answers (0)

Categories

Find more on Matrix Indexing in Help Center and File Exchange

Products


Release

R2022b

Community Treasure Hunt

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

Start Hunting!