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