我实现了一些自适应二值化方法,它们使用一个小窗口,并在每个像素处计算阈值。这些方法存在问题: 如果我们选择窗口尺寸太小我们会得到这种效果(我认为原因是因为窗口尺寸很小) alt text http://i.piccy.info/i4/3d/bc/773b7df74ff7dadfd11c09372b7e.jpeg
在左上角有一张原始图像,右上角 - 全局阈值结果。左下角 - 将图像划分为某些部分的示例(但我正在谈论分析图像的小像素周围,例如大小为10X10的窗口)。 所以你可以在右下角看到这些算法的结果,我们得到一个黑色区域,但它必须是白色的。 有人知道如何改进算法来解决这个问题吗?
答案 0 :(得分:2)
在这个领域已经进行了大量的研究,但不幸的是我没有很好的联系。
可能有效但我尚未测试过的想法是尝试估算光照变化,然后在阈值处理之前将其删除(这是一个比“二值化”更好的术语)。 然后问题从自适应阈值转移到找到一个好的照明模型。
如果您对光源有所了解,那么您当然可以从中构建模型。
否则,可能有效的快速入侵是对图像应用非常重的低通滤镜(模糊它),然后将其用作照明模型。然后在原始模糊版本和模糊版本之间创建差异图像,以及阈值。
编辑:经过快速测试后,我的“快速入侵”似乎根本无法正常工作。在考虑之后我也不会感到非常惊讶:)
I = someImage
Ib = blur(I, 'a lot!')
Idiff = I - Idiff
It = threshold(Idiff, 'some global threshold')
编辑2 根据图像的生成方式,有另外一个可能有效的想法。 尝试从图像的前几行估算照明模型:
不幸的是,我在家里没有任何好的工具来测试它。
答案 1 :(得分:2)
看起来你正在做自适应阈值处理错误。您的图像看起来好像是将图像划分为小块,计算每个块的阈值并将该阈值应用于整个块。这将解释“盒子”文物。通常,自适应阈值处理意味着分别为每个像素找到一个阈值,其中一个单独的窗口以像素为中心。
另一个建议是为你的照明建立一个全局模型:在你的样本图像中,我很确定你可以使用最小二乘法将一个平面(在X / Y /亮度空间中)拟合到图像,然后分开将像素分成更亮(前景)的像素,并且比该平面(背景)更暗。然后,您可以使用这些平面之间的平均值再次将单独的平面拟合到背景和前景像素,阈值,并迭代地改进分割。在实践中如何运作取决于你的闪电可以用线性模型建模的程度。
如果您尝试分割的实际对象是“更薄”(您在评论中说了一些条形码),您可以尝试一个简单的打开/关闭操作来获取照明模型。 (即关闭图像以移除前景像素,然后使用[闭合图像+ X]作为阈值)。
或者,您可以尝试均值平移滤波,以使前景和背景像素达到相同的亮度。 (就个人而言,我先尝试一下)
答案 2 :(得分:1)
你有非常不均匀的照明和相当大的物体(因此,没有通用的简单方法来提取背景和纠正不均匀性)。这基本上意味着你根本不能使用全局阈值,你需要自适应阈值。
您想尝试Niblack二值化。 Matlab代码可在此处获得 http://www.uio.no/studier/emner/matnat/ifi/INF3300/h06/undervisningsmateriale/week-36-2006-solution.pdf(第4页)。 您需要手动调整两个参数:窗口大小(上述代码中的N)和权重。
答案 3 :(得分:1)
尝试使用此过程应用本地自适应阈值:
本地自适应阈值方法为每个像素选择一个单独的阈值。
我正在广泛使用这种方法,并且它对于具有不均匀背景的图像工作正常。