2011-07-15 154 views
1

我有一個圖像,我的目標是二值化圖像。我用低通高斯濾波器對圖像進行了濾波,並計算了圖像的強度直方圖。使用MATLAB中的低通濾波器平滑直方圖

我現在想執行平滑的直方圖,以便我可以獲得二值化的閾值。我使用低通濾波器,但沒有奏效。這是我使用的過濾器。

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設置爲一個相對較低的數字,以便樣條曲線可以平滑直方圖。我在示例中使用了linspace來選擇中斷,但是如果您知道直方圖的某些部分比其他地方顯示出更大的曲率,那麼您希望在該區域中有更多的中斷,而其他地方則更少,以便準確地捕獲直方圖。

+1

雖然擬合樣條到直方圖會起作用,但參數可能必須根據直方圖的形狀進行調整。否則,諸如山峯或山谷等重要細節可能完全喪失。這可能相當於使用一個非常大的過濾器,在某些情況下可能是您想要的過濾器。但圖像之間的可變性可能非常高,以至於如果需要人工干預來選擇參數,那麼您也可以繪製直方圖並手動選擇一個閾值。 – cwadding

+0

嘿馬特..感謝您的部門迴應。我會嘗試樣條方法,看看它是否有效。 – Sista

+0

cwadding,這裏唯一可以人工調節的參數是中斷的數量和分佈。如果你沒有關於直方圖的先驗信息,那麼你只需要有更多的中斷,並讓它們在應用程序的像素強度值範圍內均勻分佈。運行時沒有任何人爲干預的理由。樣條曲線符合最小二乘意義上的數據,因此與控制點位置和結矢量有關的參數會自動調整以實現最佳擬合。 – Matt

0

要平滑直方圖,您需要使用一維濾鏡。這很容易使用filter函數完成。這裏是一個例子:

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

當然,你可以使用任何你選擇的平滑功能。意思是簡單地是ones(1,8)

既然你在這裏的目標只是找到二值化圖像的閾值,你可以使用使用Otsu方法的graythresh函數。

+0

謝謝。我想這是一個很好的簡單方法。 – Sista