自适应阈值已在前面几个问题中进行了讨论:
当然,有许多用于自适应阈值的算法。我想知道您发现哪些最有效和有用。
您最常使用哪种自适应算法以及针对哪种应用程序;您如何选择该算法?
自适应阈值已在前面几个问题中进行了讨论:
当然,有许多用于自适应阈值的算法。我想知道您发现哪些最有效和有用。
您最常使用哪种自适应算法以及针对哪种应用程序;您如何选择该算法?
Answers:
我认为我的答案不是一个完整的答案,但是我会提供我所知道的,并且由于这是一个社区编辑的网站,我希望有人能尽快给出一个免费的答案:)
自适应阈值处理方法是在整个图像中不使用相同阈值的方法。
但是,对于一些更简单的用法,有时使用比最简单的迭代方法更智能的方法选择阈值就足够了。Otsu的方法是一种流行的阈值化方法,它假定图像包含两类像素- 前景像素和背景像素,并具有双峰直方图。然后尝试最小化它们的组合传播(类内方差)。
可以认为是真正的自适应阈值处理方法的最简单算法是将图像分割为单元格的网格,然后在每个单元格上应用简单的阈值处理方法(例如迭代或Otsu方法),将其视为单独的图像(并假定双峰直方图)。如果子图像不能被阈值良好,则可以使用来自相邻单元之一的阈值。
查找局部阈值的另一种方法是统计地检查每个像素的局部邻域的强度值。每个像素的阈值不同,并根据其本地邻域计算得出(可以选择中值,平均值和其他选择)。函数中的OpenCV库中包含这种方法的实现cv::adaptiveThresholding
。
我发现了另一种类似的方法,即Bradley Local Thresholding。它还检查每个像素的邻域,如果像素亮度比周围像素的平均亮度低t%,则将亮度设置为黑色。相应的论文可以在这里找到。
这个stackoverflow答案提到了一种称为Niblack的本地(自适应)阈值化方法,但我之前从未听说过。
最后,在之前的一个较小的项目中,我使用了一种方法,称为“ 变分最小极大优化的图像阈值”。它是一种基于优化能量函数的迭代方法,该能量函数是两个组件的非线性组合。一个组件旨在基于图像中最强的强度变化的位置来计算阈值。另一个组件旨在平滑(对象)边界区域的阈值。它在模拟仪器的图像上已被证明是相当不错的(存在各种阴影和来自玻璃/塑料的反射),但是需要仔细选择迭代次数。
后期编辑:受此答案评论的启发。我知道在不均匀的光照条件下工作的另一种方法。我将在此处写有关黑暗背景下的明亮物体的信息,但是如果情况相反,则可以应用相同的推理。使用恒定阈值 而不是原始图像的阈值对图像的白色礼帽变换进行阈值处理。图像的白色礼帽不过是图像与它的开头之间的区别。作为进一步的解释,让我提供P. Soille的报价:Morphological Image Analysis:
以大正方形SE打开原始图像会删除所有相关的图像结构,但保留照明功能。原始图像的白色礼帽或从原始图像中减去照明功能会输出具有均匀照明的图像。
您可以在此处找到包含多种阈值方法比较的论文:
这是另一篇评估二值化方法的论文:
我在上一个项目中使用的自适应二值化方法使用积分图像来快速计算Sauvola方法使用的阈值函数。Sauvola方法描述于:
本文描述了使用积分图像提供20倍加速的修改(根据本文):
这些只是我为项目选择二值化方法(用于在图像中查找文本)时使用的论文。我不是专家,所以我不能说哪种方法最适合哪种应用程序。
这个问题已经从不同的角度得到了很好的回答,我只想总结一下我的经验,并强调一些与自适应二值化有关的问题。
自适应二值化可以分为三类:
1)全局方法:使用这种方法首先估计图像的背景;之后,借助背景信息生成标准化图像。然后采用全局二值化方法。
2)基于补丁的方法:顾名思义,基于补丁的方法将逐个补丁执行二进制化。在每个补丁处,使用全局二值化方法估计二值化。之后,执行一些后处理以确保相邻面片中的二值化阈值具有平滑过渡。
3)移动窗口方法:使用此方法,逐像素进行二值化。设置一个移动窗口以计算窗口内的像素统计信息,并根据统计信息计算窗口内中央像素的阈值。
很难确定哪种方法最好,这取决于应用程序。当您想到自适应二值化时,请不要忘记考虑以下问题:
1)参数设置:该方法是否具有自动参数设置程序?我们如何很好地设置参数,使其在大多数情况下都能正常工作?
2)证明良好的自适应二值化的标准是什么?在许多情况下,不同的二值化方法之间的差异确实很小。但是,微小的差异最终可能导致较大的差异。
3)二值化可以在某些特定情况下工作吗?例如,假设自适应二值化的目标是从黑色背景中提取对象,那么二值化是否可以自动适应这种情况?或副签证。
4)自适应方法具有仅关注局部配置的趋势,因此二进制结果未得到优化。例如,如果要优化的对象远大于移动窗口,则著名的Sauvola方法将生成空心对象。您的自适应方法可以克服此限制吗?
5)预处理。好的二值化还应该包括图像处理内部人员。如果图像太模糊,它可以自动调整算法参数或调用一些预处理以避免不良的二值化。