我实现了一些自适应二值化方法,它们使用一个小窗口,并在每个像素处计算阈值。这些方法存在问题:
如果我们选择的窗口尺寸太小,我们会得到这个效果(我认为是因为窗口尺寸小)
(来源:piccy.info)
左上角是原始图像,右上角是全局阈值结果。左下角 - 将图像划分为某些部分的示例(但我正在谈论分析图像的小像素周围,例如大小为 10X10 的窗口)。
所以你可以在右下角的图片中看到这种算法的结果,我们得到了一个黑色区域,但它必须是白色的。
有人知道如何改进算法来解决这个问题吗?
最佳答案
这个领域应该有很多研究正在进行,但不幸的是我没有好的链接可以提供。
一个可能可行但我没有测试过的想法是尝试估计光照变化,然后在阈值化之前将其删除(这是一个比“二值化”更好的术语)。
然后问题从自适应阈值转移到寻找一个好的光照模型。
如果您对光源有任何了解,那么您当然可以从中构建模型。
否则,一个可能有效的快速技巧是对您的图像应用一个非常重的低通滤波器(模糊它),然后将其用作您的照明模型。然后在原始版本和模糊版本之间创建一个差异图像,并设置阈值。
编辑 :经过快速测试,我的“快速破解”似乎根本不起作用。仔细想想我也不是很惊讶:)
I = someImage
Ib = blur(I, 'a lot!')
Idiff = I - Idiff
It = threshold(Idiff, 'some global threshold')
编辑 2
有另一个想法可以根据您的图像的生成方式起作用。
尝试从图像的前几行估计照明模型:
不幸的是,我在家没有任何好的工具来测试这个。
关于image-processing - 自适应阈值二值化的不良影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2282847/