5

我试图教我的相机成为扫描仪:我拍摄打印文本的照片,然后将它们转换为位图(然后转换为djvu和 OCR'ed)。我需要计算一个阈值,哪个像素应该是白色的,哪个是黑色的,但是我被不均匀的照明所阻碍。例如,如果中心的像素足够暗,我很可能会在角落里看到一堆黑色像素。

在相对简单的假设下,我想做的是在阈值化之前补偿不均匀的照明。更确切地说:

  • 假设有一个或两个光源,可能一个在整个表面上的光强度逐渐变化(环境光),另一个具有反向正方形(直射光)。

  • 假设纸张的白色部分都具有相同的反射率/反照率/其他。

  • 找到一些算法来估计每个像素的照明度,并从中恢复每个像素的反射率。

  • 根据像素的反射率,将其分类为白色或黑色

我不知道如何编写算法来做到这一点。我不想依靠最小二乘拟合,因为在估计照明时我想以某种方式忽略暗像素。我也不知道算法是否可行。

所有有用的建议都将被投票!


编辑:我绝对考虑过将图像切成足够大的块,这样它们仍然看起来像“白色背景上的文本”,但足够小,以至于单块的照明或多或少是均匀的。我认为,如果我随后对阈值进行插值,以使子图像边界之间没有不连续性,我可能会得到一些不错的结果。这是一个很好的建议,我将不得不试一试,但它仍然给我留下了在哪里划清白色和黑色之间的界限的问题。更多想法?


编辑:这里有一些来自 GIMP 的屏幕转储,显示了不同的直方图和每个直方图的“最佳”阈值(手动选择)。在三个中的两个中,整个图像的单个阈值就足够了。然而,在第三个中,左上角确实需要一个不同的阈值:

4

10 回答 10

5

我不确定你是否仍然需要一个解决方案,但如果你仍然需要。几年前,我和我的团队用相机拍摄了大约 250,000 页,并将它们转换为(几乎是黑白)灰度图像,然后我们使用 DjVued(也制作 pdf)。

(请参阅法国本地治里学院 1144 份纸质成绩单的目录和完整的照片传真收藏。)

我们还遇到了光照不均匀的问题。我们想出了一个简单的简单的解决方案,在实践中效果很好。该解决方案还应该可以创建黑白图像而不是灰度图像(正如我将描述的那样)。

  1. 相机和灯光设置

    a) 我们将一个空的相框贴在桌子的顶部,以使我们的页面保持在完全相同的位置。

    b)我们将相机放在三脚架上,也放在上面桌子的顶部,并指向贴有胶带的相框和一个大约一英尺宽的杆,连接到相机顶部的外部闪光灯支架上,我们连接了两个“造型灯” . 这些可以在任何好的相机商店购买。它们旨在提供均匀的照明。通过在每个造型灯周围放置小纸板箱,相机被灯光遮住。我们以灰度拍摄,然后进一步处理。(我们的页面是用蓝色墨水书写的旧棕色纸,因此您的案例应该更简单)。

  2. 图像处理

    我们使用了免费软件包irfanview

    该软件具有批处理模式,可以同时进行颜色校正、更改位深度和裁剪图像。我们会拍一张页面的照片,然后在交互模式下调整亮度、对比度和伽玛设置,直到它接近黑白。(我们使用灰度,但通过将位深度设置为 2,当您对所有页面进行批处理时,您将获得黑白。)确定最佳颜色校正后,我们以交互方式裁剪单个图像并记录裁剪设置。然后我们在批处理模式窗口中设置所有这些设置并处理一本书的页面。

  3. 创建 DjVu 图像。

    我们使用免费的DjVu Solo 3.1创建 DjVu 图像。这有几种创建 DjVu 图像的模式。创建黑白图像的模式不适用于我们的照片,但“照片”模式可以。

    我们没有 OCR(因为图像是手写的梵文),但只要字母均匀照明,我认为您的 OCR 软件应该忽略大的黑色区域,例如两页之间的跨页。但是你总是可以通过裁剪页面两次来消除两页展开之间或边缘处的黑色,一次用于左侧页面,一次用于右侧页面,并且 irfanview 软件将允许您巧妙地为页面编号,以便您然后可以以正确的顺序重新合并页面。即,将您的页面重命名为 page-xxxA 用于左侧页面,page-xxxB 用于右侧页面,然后页面将按名称正确排序。

如果您仍然需要解决方案,我希望以上一些内容对您有用。

于 2011-11-10T04:03:20.977 回答
2

我建议校准相机。考虑到您的照明设置是固定的(即灯光不会在图片之间移动),并且您的相机是灰度的(不是彩色的)。

拍一张覆盖“扫描仪”整个工作区域的白纸的照片。存储这张图片,它告诉每个像素什么是白纸。现在,当您为要扫描的文档拍照时,您可以在执行阈值之前重新加载“白色参考图片”甚至照明。

让我们称白色参考REF,图片DOC,均匀照明图片EVEN,以及一个像素的最大值MAX(对于8bit成像,它是255)。对于每个像素:

EVEN = DOC * (MAX/REF)

笔记:

  • 注意括号:大多数图像处理库使用图像像素类型对像素值执行计算,简单的乘法会使像素过载。最终,自己编写循环并使用 32 位整数进行中间计算。
  • 白色参考图像可以在用于该过程之前进行平滑处理。任何平滑或模糊滤镜都可以,并且毫不犹豫地积极应用它。
  • 上式中的 MAX 值表示生成图像中的目标像素值。使用最大像素值会针对亮白色,但您可以调整此值以针对较浅的灰色。
于 2009-11-28T08:22:46.693 回答
1

我假设您正在拍摄白色背景上(相对)小的黑色字母的图像。

一种方法可以是“移除”小的黑色物体,同时保持背景的照明变化。这给出了图像如何被照亮的估计,可用于对原始图像进行归一化。通常从原始图像中减去光照估计就足够了,然后进行基于阈值的分割。该方法基于灰度形态滤波器,可以在 matlab 中实现,如下所示:

img = imread('filename.png');
illumination = imclose(img, strel('disk', 10)); 
imgCorrected = img - illumination; 
thresholdValue = graythresh(imgCorrected); 
bw = imgCorrected > thresholdValue;

有关真实图像的示例,请查看mathworks的本指南。为了进一步了解形态图像分析的使用,可以推荐 Pierre Soille 的这本书。

于 2009-11-28T11:29:08.053 回答
1

出色地。通常我做的图像处理对时间非常敏感,所以像你正在寻找的那种复杂的算法是行不通的。但 。. . 您是否考虑过将图像切成小块并重新缩放每个子图像?即使在可变照明条件的图像中,这也应该使“暗”像素相当突出(我在这里假设您正在谈论带有深色文本的标准大部分白色页面。)

这是一个作弊,但比你建议的“正确”方式容易得多。

于 2009-11-28T06:49:58.680 回答
1

这可能非常慢,但我建议将扫描的表面分成四分之一/十六分之二并重新着色,以便整个页面的平均灰度级别相似。(如果您的页面页边距较大,可能会中断)

于 2009-11-28T06:51:54.700 回答
1

我想到了两种算法:

  • 高通缓解低频光照梯度
  • 具有适当半径的局部阈值
于 2009-12-21T16:57:26.723 回答
1

自适应阈值是关键词。引用 R. Fisher、S. Perkins、A. Walker 和 E. Wolfart 2003 年的一篇文章:“这种更复杂的阈值处理版本可以适应图像中不断变化的光照条件,例如由于强光照梯度而发生的光照条件或阴影。”</p>

ImageMagick 的-lat选项可以做到这一点,例如:

convert -lat 50x50-2000 input.jpg output.jpg

示例输入 input.jpg

示例输出 output.jpg

于 2016-08-29T08:09:28.900 回答
0

您还可以尝试使用变化率控制的阈值滞后。这是正常阈值滞后的链接。将第一个阈值设置为典型的白色值。将第二个阈值设置为小于角落中的最低白色值。

不同之处在于您要检查第一个和第二个阈值之间所有值的像素之间的差异。理想情况下,如果差异为正,则正常行事。但如果它是负数,你只想在差异很小的情况下设置阈值。

这将能够补偿照明变化,但会忽略背景和文本之间的巨大变化。

于 2009-12-21T16:54:58.443 回答
0

您可以尝试使用边缘检测过滤器,然后使用洪水填充算法来区分背景和前景。对填充区域进行插值以确定局部光照;您还可以修改填充算法以使用本地背景值来跳过线条和填充框等。

于 2009-11-28T09:11:21.277 回答
-1

为什么不用简单的开合操作呢?试试这个,看看结果:src - 源图像

src - 打开(src) 关闭(src) - src

并查看使用不同窗口大小的 close - src 结果,您将获得图像的背景。我认为这有帮助。

于 2010-03-02T02:25:34.627 回答