不均匀照明图像

时间:2010-03-19 13:16:02

标签: image-processing image-enhancement

如何摆脱包含文本数据的图像不均匀照明,通常是打印但可能是手写的?它可以有一些光点,因为在拍照时反射的光线。 我已经看到了Halcon程序的segment_characters函数正在完美地完成这项工作, 但它不是开源的。 我希望将图像转换为在背景处具有恒定照明的图像以及更深色的文本区域。因此二值化将很容易且没有噪音。 假设文本是深色而不是背景。 有什么想法吗?

6 个答案:

答案 0 :(得分:2)

严格来说,假设您可以访问图像的像素(您可以在线搜索如何使用编程语言完成此操作,因为主题可用),练习包括遍历像素一次以确定“黑暗阈值” ”。为此,您需要转换RGB to HSL中的每个像素,以便为每个像素获取亮度级别组件。在此过程中,您可以计算整个图像的平均亮度,您可以将其用作“黑暗阈值”

获得图像平均亮度级别后,您可以再次检查图像像素,如果像素小于黑暗阈值,则将其颜色设置为全白RGB(255,255,255),否则,将其颜色设置为完整黑色RGB(0,0,0)。这将为您提供一个二进制图像,其中文本应为黑色 - 其余应为白色。

当然,关键在于找到合适的黑暗阈值 - 所以如果平均方法不能给你带来好的结果,你可能不得不想出一个不同的方法来增强这个步骤。这种方法可能涉及分离主要通道红色,绿色,蓝色中的图像,并分别计算每个通道的暗度阈值,然后使用三个的激进阈值。

最后,一个更好的方法可能是计算光照水平分布 - 而不是简单的平均值 - 然后从中,最大值的范围是你想要保持的。再次,遍历每个像素,如果它的亮度适合该带使其变黑,否则,使其变为白色。

修改

有关HSL的进一步阅读,我建议从Wiky entry on HSL and HSV Color spaces开始。

答案 1 :(得分:2)

你尝试过使用形态学技巧吗?通过重建闭合(如Gonzalez, Woods and Eddins中所示)可用于创建背景照明水平的灰度表示。您可以通过以下方式或多或少地标准化有效照明:

1)计算图像中所有像素的平均强度

2)使用重建闭合来估计背景照明水平

3)从原始图像中减去(2)的输出

4)将(1)的平均强度加到(3)的输出中的每个像素上。

基本上,重建闭包会删除所有小于特定大小的图像特征,删除“前景”(您要捕获的文本)并仅留下“背景”(照明级别)。从原始图像中减去结果仅留下小规模的偏差(文本)。将原始平均强度添加到这些偏差只是为了使文本可读,以便生成的图片看起来像原始图像的光标准化版本。

答案 2 :(得分:2)

使用Local-Thresholding而不是全局阈值算法。 将图像(灰度)划分为较小图像的网格(例如50x50像素),并在每个单独的图像上应用阈值算法。

答案 3 :(得分:0)

如果背景要素通常大于字母,您可以尝试估算并随后删除背景。

有很多方法可以做到这一点,一个非常简单的方法就是在图像上运行中值滤波器。您希望过滤器窗口足够大,窗口内的文本很少占像素的三分之一,但足够小,以至于有几个窗口适合亮点。此过滤器应生成没有文本的图像,但仅限背景。从原始图形中减去该图像,您应该有一个可以使用全局阈值进行分割的图像。

请注意,如果亮点比文本小得多,则执行相反的操作:选择滤镜窗口,使其仅移除光线。

答案 4 :(得分:0)

你需要尝试做的第一件事就是改变照明,使用顶灯或其他一些能让你散发更均匀光线的光。

如果无法做到这一点,您可以尝试this questionthis one中的一些想法。您希望实现某种类型的“自适应阈值”,这会将局部阈值应用于图像的各个部分,这样对比度的变化就不会那么明显。

还有一个简单但有效的方法解释here。算例的简单概述如下:

  1. 将图像拆分为NxN区域或邻域
  2. 计算邻域的平均或中值像素值
  3. 根据2)中计算的值或2)减去C(其中C是选定常数)的值来阈值区域

答案 5 :(得分:0)

您似乎想做的是改善局部对比度,同时减弱更大范围的照明变化。我同意其他海报,通过更好的照明来优化图像始终是第一步。

在那之后,有两个技巧。

1)使用smooth_image()运算符将高斯卷积在原始图像上。使用相对较大的内核,例如20-50px。然后从原始图像中减去该模糊图像。在sub_image()运算符中应用比例尺和偏移量,或使用equ_histo()均衡直方图。

这基本上从原始图像中减去低空间频率信息,而完整保留较高频率信息。

2)您可以尝试highpass_image()运算符或laplacian运算符之一来提取渐变图像。