如何将一页文本的图像转换为纯黑白并锐化文本?
由于光线不均匀,调整亮度/对比度并不容易。
首先,为了避免彩色条纹,您可以处理图像的灰度版本,或者Image>Mode>Grayscale
或Color>Desaturate
。如果您使用的是 Gimp 2.10,您还可以设置Image>Precision
为 32 位浮点/线性。
然后,您将以下技术(*)应用于均匀照明:
- 复制图像层
- 应用足以使文本完全消失的高斯模糊(图像上大约 50 像素)
- 将顶层设置为
Grain extract
模式 - 使用结果创建一个新层:
Layer>New from visible
在生成的图层中,背景是灰色的(大约 50%),但灰色更均匀。在直方图中,这是一个大尖峰。然后,您可以舒适地使用“级别”工具来优化结果。在“输入”设置中:
- 大尖刺中间稍偏左的右手柄(其右侧的任何东西都变成完全白色)
- 直方图似乎停止的左侧句柄(其左侧的任何内容都变为完全黑色)
- 调整中间手柄以优化对比度
页面另一侧的文本显示并限制了您拉伸对比度的能力。下次拍摄这些照片时,请带上一张深色纸(最好是黑色的),插入您正在拍摄的页面下方。
(*) 稍微解释一下:
- 使用高斯模糊,像素值被周围区域的亮度替换(假设模糊足够宽,可以忽略文本等局部细节的影响)
- 颗粒提取,基本上是一个减法,从初始图像中的像素中减去该区域的平均亮度:
- 对于背景像素,它们周围背景的平均值被移除,因此无论初始背景亮度如何,结果都接近于零(实际上是 50% 灰度,因为
Grain extract
给结果增加了偏差), - 对于主题像素(通常与背景完全不同),差异远非 0,并且它们仍然可见。
- 对于背景像素,它们周围背景的平均值被移除,因此无论初始背景亮度如何,结果都接近于零(实际上是 50% 灰度,因为
简单的对比度提升将不起作用,因为光线不均匀。
不均匀的光可以通过高通滤波在某种程度上被平坦化。(这并不完美,因为缺少局部对比度将无法修复)。这是高通滤波器的分割视图场景:
应用曲线可用于增加对比度。不幸的是,它还增加了颜色差异和边缘所有不需要的废话:
但是边缘可以涂成白色或剪掉,颜色可以去饱和(这里不做):
过滤器“阈值”使一切都严格黑白。我发现保留一些灰度的陡峭曲线会产生更好的可读性。
在您的情况下,在开始时去饱和很有用,因为它可以防止可能导致的所有颜色提升(OCR 不同,去饱和会增加错误)。例如,有色污垢只有在图像被着色时才会受到攻击。此外,您想要 BW 中的结果。
这仍然不是最好的明显对比。较暗的文本可用于边缘检测。不幸的是,它使图像变为负值,但是当最终对比度被拉伸以限制曲线时,结果可能会同时反转。在下一个示例中,图像首先是去饱和的,然后经过 Sobel 边缘检测过滤,屏幕截图显示了正在使用的曲线工具:
注意:纸张边缘保持干净,没有剪裁任何东西。
增强字母需要一些模式匹配过滤,它知道这是打字文本并用完美的字母替换字母。那是OCR。
我相信至少谷歌喜欢阅读你的文档并为你做 OCR 的事情。作为可安装软件,有商业包和 FreeOCR。
我清理了输出图像的边缘并将其放到 FreeOCR 中。这是结果。
所有多余的空格都被删除。在 FreeOCR 中无法控制它。
您会看到完全检查是必须的,但它仍然比重新输入更快。下一个问题是成功的 OCR 实际需要什么文件预处理,可能不是最高的明显对比度?
我做了一些测试。很明显,最高可能的明显对比度会导致错误。需要的最佳结果:
- 没有去饱和度,很多废话的颜色与文本不同,OCR 可以更容易地拒绝它们的颜色
- 高通滤波以消除整体亮度变化
- 增强对比度以使纸张上的鬼字褪色。如果鬼影有明显不同的颜色,则完全褪色是没有用的,因为褪色也会删除想要的文字中的某些内容。
- 裁剪掉所有额外的区域
这是一个屏幕截图:
我这样做是:
图像->模式->索引然后选择“使用黑白(1位)调色板”
(Gimp 2.1)