如何补偿打印页面照片中的不均匀照明?

时间:2009-11-28 06:44:50

标签: image-processing image-scanner

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

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

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

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

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

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

我不知道如何编写算法来执行此操作。我不想回到最小二乘拟合,因为我估计在估计光照时忽略暗像素。我也不知道算法是否可行。

所有有用的建议都会被赞成!


编辑:我绝对考虑将图像切成足够大的碎片,使它们仍然看起来像“白色背景上的文字”但足够小,以便单个照片更多甚至更少。我想如果我然后插入阈值,以便在子图像边界之间没有不连续性,我可能会得到一些不错的东西。这是一个很好的建议,我将不得不试一试,但它仍然留给我在白色和黑色之间划线的问题。更多的想法?


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

10 个答案:

答案 0 :(得分:5)

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

(请参阅The catalogue and complete collection of photographic facsimiles of the 1144 paper transcripts of the French Institute of Pondicherry。)

我们也遇到了不均匀照明的问题。我们提出了一个简单的简单解决方案,在实践中非常有效。此解决方案还应该用于创建黑白图像而不是灰度(如我所述)。

  1. 相机和灯光设置

    a)我们将一个空白相框粘贴到表格顶部,以使我们的页面保持完全相同的位置。

    b)我们将相机放在桌子顶部的三脚架上,并指向录制的相框和一个宽约一英尺的条形物,它连接到相机顶部的外部闪光灯支架上,我们附加了两个“造型灯“。这些可以在任何好的相机商店购买。它们旨在提供均匀的照明。通过在每个造型灯周围放置一个小纸板箱,将相机遮挡在灯光下。我们拍摄了灰度,然后我们进一步处理。 (我们的页面是用蓝色墨水书写的旧褐色纸,所以你的情况应该更简单。)

  2. 处理图片

    我们使用了免费软件包irfanview

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

  3. 创建DjVu图像。

    我们使用免费DjVu Solo 3.1来创建DjVu图像。这有几种模式来创建DjVu图像。创建黑白图像的模式对于我们的照片效果不佳,但“照片”模式确实如此。

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

  4. 如果你仍然需要一个解决方案,我希望上面的一些对你有用。

答案 1 :(得分:2)

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

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

让我们调用白色参考REF,图像DOC,偶数照明图像EVEN和像素MAX的最大值(对于8位成像,它是255)。对于每个像素:

EVEN = DOC * (MAX/REF)

注释:

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

答案 2 :(得分:1)

好。通常我所做的图像处理是高度时间敏感的,所以像你所寻求的复杂算法是行不通的。但是。 。 。您是否考虑过将图像切成小块,然后重新缩放每个子图像?即使在可变照明条件的图像中,这也应该使“暗”像素表现得相当出色(我假设你在这里谈论的是一个带有深色文本的标准大多数白页。)

它是一种骗局,但比你建议的“正确”方式容易得多。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

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

有关真实图像的示例,请查看mathworks中的本指南。有关使用形态图像分析的更多信息,可以推荐Pierre Soille使用this book

答案 5 :(得分:1)

我想到了两种算法:

  • 高通以减轻低频照明梯度
  • 具有适当半径的本地阈值

答案 6 :(得分:0)

您可以尝试使用边缘检测滤镜,然后使用填充算法来区分背景和前景。插入填充区域以确定局部照明;您也可以修改Floodfill算法以使用本地背景值跳过线条和填充框等等。

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

自适应阈值是关键字。引用2003年article由R. Fisher,S。Perkins,A。Walker和E. Wolfart:“这个更复杂的版本 阈值处理可以适应图像中变化的光照条件,例如, 由于强烈的照明梯度或阴影而发生的那些。“

答案 9 :(得分:-1)

为什么不使用简单的开闭操作? 试试这个,只是结果: src - cource image

src - open(src) close(src) - src

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