在对图像应用高斯模糊时,通常需要指定一个参数 sigma(例如 Matlab 和 ImageJ)。
如何确定 sigma 的值?有没有数学方法来找到最佳的 sigma 值?在我的情况下,我有一些在图像中与背景相比较亮的物体,我需要通过计算找到它们。我将应用高斯滤波器来使这些物体的中心更加明亮,这有助于更容易地找到它们。那么,如何确定这个问题的最佳 sigma 值呢?
在对图像应用高斯模糊时,通常需要指定一个参数 sigma(例如 Matlab 和 ImageJ)。
如何确定 sigma 的值?有没有数学方法来找到最佳的 sigma 值?在我的情况下,我有一些在图像中与背景相比较亮的物体,我需要通过计算找到它们。我将应用高斯滤波器来使这些物体的中心更加明亮,这有助于更容易地找到它们。那么,如何确定这个问题的最佳 sigma 值呢?
针对您的情况,没有一个公式可以为您确定最佳的sigma值; 最优的sigma值将取决于图像因素-主要是图像的分辨率和其中对象的大小(以像素为单位)。
此外,请注意,高斯滤波器实际上并不是用来增强任何内容的;您可能需要研究最大对比度技术-听起来像是一些简单的直方图拉伸技术可以很好地解决这个问题。
编辑: 更多解释-sigma基本上控制着您的核函数要变得多“胖”;更高的sigma值会使模糊半径更大。由于您正在处理图像,更大的sigma还会迫使您使用较大的核矩阵来捕获足够的函数能量。对于您的特定情况,您希望您的核足够大以覆盖大部分对象(以便它们被模糊),但不能太大,以至于它开始同时重叠多个相邻对象-因此,物体分离也是一个重要因素。
由于您提到了MATLAB-您可以使用fspecial('gaussian', hsize, sigma)
函数查看具有不同参数的各种高斯核。其中hsize
是核的大小,sigma
是sigma值。尝试改变这些参数以查看其如何变化。
我通常使用这个公式作为经验法则,如果k
是内核的大小,那么sigma=(k-1)/6
。这是因为高斯概率密度函数 99百分位点长度为 6sigma。
k=2*ceil(3*sigma)+1
。 - Cris Luengofil = fspecial('sobel');
im = imfilter(I,fil);
imagesc(im);
colormap = gray;
这个操作可以给你图像的一阶导数结果,现在你想通过最大化G(X,sigma)来找到最大的sigma值,这意味着你需要尝试几个sigma值(比如按递增顺序),直到找到一个使得G最大的sigma值。这也可以用二阶导数来实现。
假设内核的中心值为1,保证外层值小于一个限制(例如1/100)的维数如下:
double limit = 1.0 / 100.0;
size = static_cast<int>(2 * std::ceil(sqrt(-2.0 * sigma * sigma * log(limit))));
if (size % 2 == 0)
{
size++;
}