给定一张图像(如下图所示),我需要将其转换为二进制图像(仅限黑白像素)。这听起来很简单,我尝试过两个阈值函数。问题是我无法使用这些函数中的任何一个来获得完美的边缘。任何帮助将不胜感激。
我尝试过的过滤器是 RGB 和 HSV 空间中的欧几里得距离。
示例图片:
这是运行 RGB 阈值过滤器之后的结果。 (40% 在此之后更多的artefects)
这是运行 HSV 阈值过滤器后的结果。 (在 30% 时,路径变得几乎看不见,但由于噪音而明显无法使用)
我使用的代码非常简单。将输入图像更改为适当的颜色空间并检查与黑色的欧几里得距离。
sqrt(R*R + G*G + B*B)
因为我正在与黑色 (0, 0, 0) 进行比较
您的问题似乎是扫描图像上的照明变化,这表明局部自适应阈值方法将为您提供更好的结果。
Sauvola 方法根据原始图像窗口中像素的平均值和标准差计算二值化像素的值。这意味着,如果图像的某个区域通常较暗(或较亮),则将针对该区域调整阈值,并且(可能)在二值化图像中减少暗点或褪色线。
http://www.mediateam.oulu.fi/publications/pdf/24.p http://www.mediateam.oulu.fi/publications/pdf/24.p
我还发现了 Shafait 等人的方法。以更高的时间效率实现 Sauvola 方法。缺点是您必须计算原始图像的两个积分图像,一个以每像素 8 位计算,另一个可能以每像素 64 位计算,这可能会带来内存限制的问题。
http://www.dfki.uni-kl.de/~shafait/papers/Shafait-efficient-binarization-SPIE08.pdf http://www.dfki.uni-kl.de/~shafait/papers/Shafait-efficient-binarization-SPIE08.pdf
我还没有尝试过这两种方法,但它们看起来确实很有希望。我通过粗略的 Google 搜索找到了两者的 Java 实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)