1

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

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

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

谁能帮我这个?直方图平滑的过程是什么?

imhist(Ig);

非常感谢您的帮助。

4

2 回答 2

0

要平滑直方图,您需要使用一维滤波器。使用过滤器功能很容易做到这一点。这是一个例子:

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

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

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

于 2011-07-15T15:25:51.930 回答
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 来选择中断,但如果您知道直方图的某些部分比其他地方表现出更大的曲率,那么您希望在该区域有更多的中断而不是其他地方,以便准确捕获形状直方图。

于 2011-07-15T14:47:25.683 回答