我有一個圖像,我的目標是二值化圖像。我用低通高斯濾波器對圖像進行了濾波,並計算了圖像的強度直方圖。使用MATLAB中的低通濾波器平滑直方圖
我現在想執行平滑的直方圖,以便我可以獲得二值化的閾值。我使用低通濾波器,但沒有奏效。這是我使用的過濾器。
h = fspecial('gaussian', [8 8],2);
任何人都可以幫助我嗎?關於平滑直方圖的過程是什麼?
imhist(Ig);
非常感謝您的幫助。
我有一個圖像,我的目標是二值化圖像。我用低通高斯濾波器對圖像進行了濾波,並計算了圖像的強度直方圖。使用MATLAB中的低通濾波器平滑直方圖
我現在想執行平滑的直方圖,以便我可以獲得二值化的閾值。我使用低通濾波器,但沒有奏效。這是我使用的過濾器。
h = fspecial('gaussian', [8 8],2);
任何人都可以幫助我嗎?關於平滑直方圖的過程是什麼?
imhist(Ig);
非常感謝您的幫助。
最近我一直在研究一個非常類似的問題,試圖計算閾值,以便在對圖像執行其他計算之前從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來選擇中斷,但是如果您知道直方圖的某些部分比其他地方顯示出更大的曲率,那麼您希望在該區域中有更多的中斷,而其他地方則更少,以便準確地捕獲直方圖。
雖然擬合樣條到直方圖會起作用,但參數可能必須根據直方圖的形狀進行調整。否則,諸如山峯或山谷等重要細節可能完全喪失。這可能相當於使用一個非常大的過濾器,在某些情況下可能是您想要的過濾器。但圖像之間的可變性可能非常高,以至於如果需要人工干預來選擇參數,那麼您也可以繪製直方圖並手動選擇一個閾值。 – cwadding
嘿馬特..感謝您的部門迴應。我會嘗試樣條方法,看看它是否有效。 – Sista
cwadding,這裏唯一可以人工調節的參數是中斷的數量和分佈。如果你沒有關於直方圖的先驗信息,那麼你只需要有更多的中斷,並讓它們在應用程序的像素強度值範圍內均勻分佈。運行時沒有任何人爲干預的理由。樣條曲線符合最小二乘意義上的數據,因此與控制點位置和結矢量有關的參數會自動調整以實現最佳擬合。 – Matt
要平滑直方圖,您需要使用一維濾鏡。這很容易使用filter函數完成。這裏是一個例子:
I = imread('pout.tif');
h = imhist(I);
smooth_h = filter(normpdf(-4:4, 0,1),1,h);
當然,你可以使用任何你選擇的平滑功能。意思是簡單地是ones(1,8)
。
既然你在這裏的目標只是找到二值化圖像的閾值,你可以使用使用Otsu方法的graythresh函數。
謝謝。我想這是一個很好的簡單方法。 – Sista
你可以發佈你想要過濾的東西的圖片嗎? – Phonon
你能告訴我們你的直方圖有多少個垃圾箱? – Phonon