私は2次元画像を持っています.極小値が発生する場所があります. それらの最小値に「つながる」谷の幅を測定したいと思います。これらの谷にフィットする円または楕円の半径が必要です。ここに添付された例、ピークの等高線上の濃い赤の線は、私が見つけたいものです。ありがとう。
3 に答える
@Lucasの答えを部分的に拡張しています。
しきい値が与えられた場合、私はあなたの最小の特定のポイントより下でより近いt
ポイントを考慮します(特徴的なスケールの長さを与えられた場合)。P_m
t
m
f
r
(データにノイズが多いとおっしゃいました。最小値を区別して井戸について話すには、そのような値を推定する必要がありr
ます。たとえばr=4
、最小値間の距離の半分などです)。
次に、各ウェル領域 のメトリックを検討する必要がありますP_m
。たとえば、
metric(P_m) = .5 * mean{ maximum vertical diameter of P_m ,
maximum horizontal diameter of P_m}.
metric(P_m) = 2
両方の井戸のあなたの写真で。
全体として、擬似コードの観点から、あなたは考えるかもしれません
M := set of local minima of f
for_each(minimum m in M){
P_m += {p : d(p,m) < r and f(r)<t} % say that += is the push operation in a Stack
}
radius_of_region_around(m) = metric(P_m); %
おそらく、しきい値を超えるすべてのポイントを見つけることによって、楕円のエッジの値を表すポイントのリストを作成することをお勧めします。
above = data > threshold
単純なエッジ検出器を適用する
edges = EdgeDetector(above)
エッジの座標を見つける
[row,col] = find(edges)
次に、この楕円フィッターを適用しますhttp://www.mathworks.com/matlabcentral/fileexchange/3215-fitellipse
x
ここでは、y
およびz
データにアクセスでき、特定の JPG (またはその程度) の画像を処理していないと想定しています。次に、関数contourc
を有利に使用できます。
% plot some example function
figure(1), clf, hold on
[x,y,z] = peaks;
surf(x,y,z+10,'edgecolor', 'none')
grid on, view(44,24)
% generate contour matrix. The last entry is a 2-element vector, the last
% element of which is to ensure the right algorithm gets called (so leave
% it untouched), and the first element is your threshold.
C = contourc(x(1,:), y(:,1), z, [-4 max(z(:))+1]);
% plot the selected points
plot(C(1,2:end), C(2,2:end), 'r.')
次に、この超高速楕円フィッティング ツールを使用して、それらの点を通る楕円をフィッティングし、必要な楕円のすべてのパラメーターを見つけます。
上記を読んhelp contourc
でdoc contourc
、上記が機能する理由と、他に何に使用できるかを確認することをお勧めします。