MATLAB中直方图的低通滤波平滑

MATLAB中直方图的低通滤波平滑,matlab,filter,histogram,gaussian,smoothing,Matlab,Filter,Histogram,Gaussian,Smoothing,我有一个图像,我的目标是对图像进行二值化。我用低通高斯滤波器过滤了图像,并计算了图像的强度直方图 现在我想对直方图进行平滑处理,以便获得二值化的阈值。我用了一个低通滤波器,但它不起作用。这是我用的过滤器 h = fspecial('gaussian', [8 8],2); 有人能帮我吗?直方图平滑的过程是什么 imhist(Ig); 非常感谢您的帮助。我最近一直在研究一个非常类似的问题,试图计算一个阈值,以便在对图像执行其他计算之前从MRI数据中排除噪声背景像素。我所做的是将样条曲线拟合到直

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

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

h = fspecial('gaussian', [8 8],2);
有人能帮我吗?直方图平滑的过程是什么

imhist(Ig);

非常感谢您的帮助。

我最近一直在研究一个非常类似的问题,试图计算一个阈值,以便在对图像执行其他计算之前从MRI数据中排除噪声背景像素。我所做的是将样条曲线拟合到直方图,以使其平滑,同时保持形状的精确拟合。我使用文件交换中的包来执行装配。我为一起处理的一堆图像计算了一个直方图,但对于单个图像,它的效果应该类似。我还碰巧使用了柱状图数据的对数变换,但这可能对您的应用程序有用,也可能不有用

[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来拾取打断,但是如果您知道直方图的某些部分比其他部分显示出更大的曲率,那么您希望该区域的打断更多,而其他区域的打断更少,以便准确捕捉直方图的形状。

要平滑直方图,需要使用一维过滤器。使用该函数可以轻松完成此操作。以下是一个例子:

I = imread('pout.tif');
h = imhist(I);
smooth_h = filter(normpdf(-4:4, 0,1),1,h);
当然,您可以使用您选择的任何平滑函数。平均值仅为1,8


因为您的目标只是找到对图像进行二值化的阈值,所以您可以使用使用Otsu方法的函数。

您可以发布您尝试过滤的对象的图像吗?您至少可以告诉我们您的直方图有多少个箱子吗?尽管将样条曲线拟合到直方图会起作用,这些参数可能必须根据直方图的形状进行调整。否则,诸如峰值或谷值之类的重要细节可能会完全丢失。这可能相当于使用非常大的过滤器,在某些情况下,这可能是您想要的。但是,图像之间的可变性可能非常高,如果需要人为干预来选择参数,那么您也可以绘制直方图并手动选择阈值。。谢谢你的回复。我将尝试样条线方法,看看它是否有效。此外,这里唯一可调整的参数是断点的数量和分布。如果你没有关于直方图的好的先验信息,那么你只需要有更多的中断,并让它们均匀地分布在应用程序的像素强度值范围内。在运行时,实际上没有任何人为干预的理由。样条曲线正以最小二乘法拟合数据,因此与控制点位置和节点向量相关的参数将自动调整以实现最佳拟合。谢谢。我想这是一个很好的简单方法。