私は最近、非常によく似た問題に取り組んでおり、画像に対して他の計算を実行する前に、ノイズの多い背景ピクセルを MRI データから除外するためにしきい値を計算しようとしています。私がしたことは、形状の正確な適合を維持しながらヒストグラムを滑らかにするためにスプラインをヒストグラムに適合させることでした。ファイル交換のsplinefitパッケージを使用してフィッティングを実行しました。一緒に処理された画像のスタックのヒストグラムを計算しましたが、個々の画像でも同様に機能するはずです。また、たまたまヒストグラム データの対数変換を使用しましたが、それはアプリケーションにとって有用な手順である場合とそうでない場合があります。
[my_histogram, xvals] = hist(reshape(image_volume), 1, []), number_of_bins);
my_log_hist = log(my_histogram);
my_log_hist(~isfinite(my_log_hist)) = 0; % Get rid of NaN values that arise from empty bins (log of zero = NaN)
figure(1), plot(xvals, my_log_hist, 'b');
hold on
breaks = linspace(0, max_pixel_intensity, numberofbreaks);
xx = linspace(0, max_pixel_intensity, max_pixel_intensity+1);
pp = splinefit(xvals, my_log_hist, breaks, 'r');
plot(xx, ppval(pp, xx), 'r');
スプラインは微分可能であり、ppdiff を使用して導関数を取得できることに注意してください。これは、適切なしきい値を選択するのに役立つ最大値と最小値を見つけるのに役立ちます。numberofbreaks
スプラインがヒストグラムを平滑化するように、比較的低い数値に設定されています。この例では linspace を使用してブレークを選択しましたが、ヒストグラムのある部分が他の場所よりもはるかに大きな曲率を示していることがわかっている場合は、その領域のブレークを増やし、他の場所のブレークを減らして、形状を正確にキャプチャする必要があります。ヒストグラム。