在MATLAB中使用低通滤波器平滑直方图

时间:2011-07-15 12:41:55

标签: matlab filter histogram gaussian smoothing

我有一张图片,我的目标是将图像二值化。我用低通高斯滤波器对图像进行了滤波,并计算了图像的强度直方图。

我现在想要对直方图进行平滑处理,以便我可以获得二值化的阈值。我使用了低通滤波器,但它不起作用。这是我使用的过滤器。

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

任何人都可以帮我吗?关于直方图平滑的过程是什么?

imhist(Ig);

非常感谢你的帮助。

2 个答案:

答案 0 :(得分: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 :(得分:0)

要平滑直方图,您需要使用1-D滤镜。使用filter函数可以轻松完成此操作。这是一个例子:

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

当然,您可以使用您选择的任何平滑功能。平均值只是ones(1,8)

由于您的目标只是找到二值化图像的阈值,您可以使用使用Otsu方法的graythresh函数。