2011-07-15 49 views
1

私は画像を持っていますが、私の目的は画像を二値化することです。私はローパスガウスフィルタで画像をフィルタリングし、画像の強度ヒストグラムを計算しました。MATLABのローパスフィルタを使ったヒストグラムの平滑化

ヒストグラムのスムージングを実行して、2値化のしきい値を得ることができます。私はローパスフィルターを使用しましたが、うまくいかなかったのです。これは私が使用したフィルタです。

h = fspecial('gaussian', [8 8],2); 

誰でもこの手伝いできますか?ヒストグラムのスムージングに関するプロセスは何ですか?

imhist(Ig); 

ご協力いただきありがとうございます。

+1

フィルタリングしようとしているものの画像を投稿できますか? – Phonon

+0

ヒストグラムのビン数を教えてください。 – Phonon

答えて

0

私は、画像上で他の計算を実行する前にノイズの多い背景ピクセルを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は、スプラインがヒストグラムを滑らかにするように比較的低い数値に設定されています。私は例では余白を使ってブレークを選んでいましたが、ヒストグラムのある部分が他の部分よりも大きな曲率を示していることが分かっていれば、その領域でより多くのブレークがあり、ヒストグラム

+1

ヒストグラムにスプラインを当てはめることはできますが、パラメータはヒストグラムの形状に基づいて調整する必要があります。それ以外の場合は、ピークや谷などの重要な情報が完全に失われる可能性があります。これは、非常に大きなフィルタを使用する場合と同等の場合があります。しかし、画像間のばらつきが非常に大きいので、人間の介入によってパラメータを選択する必要がある場合は、ヒストグラムをプロットし、手動でしきい値を選択するだけでよいのです。 – cwadding

+0

ちょっとマット..ご返信いただきありがとうございます。スプライン法を試して、それがうまくいくかどうかを見てみましょう。 – Sista

+0

cwaddingでは、人間が調整可能なパラメータは、ブレークの数と分布だけです。ヒストグラムに関する先験的な情報があまりない場合は、休憩を増やし、アプリケーションのピクセル強度値の範囲全体に均等に分散させるだけで済みます。実行時に人間が介入する理由はまったくありません。スプラインは、最小二乗の意味でデータにフィットしているため、コントロールポイントの位置とノットベクトルに関連するパラメータは自動的に調整され、最適なフィットを実現します。 – Matt

0

ヒストグラムを平滑化するには、1次元フィルタを使用する必要があります。これは、filter機能を使用して簡単に実行できます。次に例を示します。

I = imread('pout.tif'); 
h = imhist(I); 
smooth_h = filter(normpdf(-4:4, 0,1),1,h); 

もちろん、任意のスムージング機能を使用できます。平均は単にones(1,8)です。

ここでの目標は、画像を2値化するためのしきい値を見つけることだけであるため、大津の方法を使用するgraythresh関数を使用することができます。

+0

ありがとうございます。私はこれが素敵な簡単なアプローチだと思います。 – Sista

関連する問題