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

二値化された画像で、特定のベクトル方向でターゲット(白色)の最大長さを出したいです。
ベクトルについては、2×2の行列の2列目をベクトル方向にしたいと考えています。
行列から特定の列や行をベクトルにするやり方も教えていただきたいです。
ご教授いただきたいと存じます。

7 comentarios

Atsushi Ueno
Atsushi Ueno el 13 de Nov. de 2022
上記のプログラムが質問の要件にマッチすると思います。使ってみて出来たら回答欄に書いておきます。
Hernia Baby
Hernia Baby el 13 de Nov. de 2022
フェレ径等ならbwferetで対応可能と思います
Atsushi Ueno
Atsushi Ueno el 13 de Nov. de 2022
>特定のベクトル方向でターゲット(白色)の最大長さを出したい
⇒定規の角度を決めて、その角度で測定したフェレ径が最大になる所を探したいのだと解釈します。
ところがbwferet関数が出力するのは「最大フェレ径」の値、即ちあらゆる角度で測定したフェレ径の中から長さが最大となる所の長さや角度を出力します。同関数の入力として角度を指定する事が出来ないのです。
R
R el 13 de Nov. de 2022
このような二値化された画像に対して赤線の長さを出したいと考えてます。
この赤線の向きに関して、この画像の白色部分を散布図だと考えて
主成分分析(pca)して軸方向(第二主成分)を出しています。
この場合でも回答されてる方法は有効でしょうか?
説明不足でもし訳ありません。ご回答いただけると幸いです。
Atsushi Ueno
Atsushi Ueno el 13 de Nov. de 2022
こちらの質問も拝見しました。
正確な楕円に対する主成分分析(pca)で得られた短軸方向(第二主成分)のフェレ径は、その楕円の短軸と一致するはずです。従って、bwferet関数が出力する最小フェレ径として得ても結果としては変わりないと思います。
しかしながら、ターゲットは必ずしも正確な楕円とは限らないと想定します。その場合、主成分分析(pca)で得られた第二主成分の最大フェレ径は、必ずしも最小フェレ径と一致するとは限らないと思います。
一方、回答した方法の説明には下記の説明があります。単に特定の方向のフェレ径が得られると解釈します。
The function imFeretDiameter computes the Feret diameter for each one of the specified directions.
(関数 imFeretDiameter は,特定された方向毎にフェレ径を計算する。)
R
R el 13 de Nov. de 2022
ご指摘の通りです。
実際は楕円では無いため特定の方向で長さを出したいです。
試してみたいと思います。

Iniciar sesión para comentar.

 Respuesta aceptada

Hernia Baby
Hernia Baby el 14 de Nov. de 2022
Editada: Hernia Baby el 14 de Nov. de 2022

0 votos

コメントを見まして、先回の回答と照らし合わせながらお答えします
まずはバイナリイメージを散布データに変えられたところから始めます
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 comentarios

R
R el 14 de Nov. de 2022
ありがとうございます。
前の質問も含め、分かりやすかったです。
R
R el 14 de Nov. de 2022
先回の部分について質問です。
SVDをかけるところで
[x1, x2] = find(BW);
X = [x1, x2];
として二値化画像からXを出しているのですが
S2=S(1:m,1:m); Values=S2^2/n; % 固有値
の部分で下記のエラーが出ます。
位置 2 のインデックスが配列範囲を超えています。インデックスは 2 を超えてはなりません。
解決策はありますでしょうか?
mは12681, nは2となっています。
Hernia Baby
Hernia Baby el 15 de Nov. de 2022
おそらく行と列が逆なので転置をかける必要があります
X = [x1, x2];
size(X)
% 転置
X = X';
size(X)
上記のようにして確認してみてください
R
R el 15 de Nov. de 2022
ありがとうございます。
解決しました。

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre イメージ en Centro de ayuda y File Exchange.

Productos

Versión

R2022b

Preguntada:

R
R
el 12 de Nov. de 2022

Comentada:

R
R
el 15 de Nov. de 2022

Community Treasure Hunt

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

Start Hunting!