【问题标题】:uneven illuminated images照明不均匀的图像
【发布时间】:2011-01-29 11:16:56
【问题描述】:

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

【问题讨论】:

  • 在这里搜索“二值化”——我想我们最近有几个问题。主要的是 - 制作一个适用于不均匀照明的二值化算法比尝试通过一些预处理来修复照明要合理得多。
  • AB:这听起来像是在系统的不同部分解决相同的问题。出于好奇,您是否知道任何在阈值处理中处理不均匀照明的研究,这在某种程度上不是一种照明适应预处理步骤?
  • 好的,那么存在什么样的预处理方法可以用来修复光照呢?

标签: image-processing image-enhancement


【解决方案1】:

严格来说,假设您可以访问图像的像素(您可以在线搜索如何用您的编程语言完成此操作,因为该主题非常丰富),该练习涉及检查像素一次以确定“暗度阈值” ”。为此,您从RGB to HSL 转换每个像素,以获得每个像素的lightness 级别组件。在此过程中,您计算​​整个图像的平均亮度,您可以将其用作“暗度阈值”

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

当然,关键在于找到合适的暗度阈值 - 因此,如果平均方法不能为您提供良好的结果,您可能必须想出一种不同的方法来增加该步骤。这种方法可能涉及分离红色、绿色、蓝色主要通道中的图像,并分别计算每个通道的暗度阈值,然后使用这三个通道的激进阈值..

最后,一个更好的方法可能是计算光照水平分布 - 而不是简单的平均值 - 然后据此,最大值附近的范围就是您想要保持的。再次,检查每个像素,如果它的亮度适合波段,则将其设为黑色,否则,将其设为白色。

编辑

如需进一步了解 HSL,我建议从 Wiky entry on HSL and HSV Color spaces 开始。

【讨论】:

  • 这是一个有趣的想法,我会尝试,但听起来像是找到全局阈值并使用该值进行阈值化,这是不同的东西,我会尝试但第一印象就像它是一个全局阈值算法。因此,如果我理解正确,您的意思是从 HSL 图像计算亮度图像并找到全局阈值会给我想要的吗?可能是我误解了什么,抱歉,我需要更多解释。
  • -1:如果光照不均匀,全局阈值将不起作用。考虑从左侧几乎是白色到右侧几乎全黑的渐变背景:全局平均值当然会介于两者之间(某种灰色)。这意味着一半的图像将变成黑色,另一半变成白色。此外,恕我直言,如果您使用的只是亮度/色度通道,则无需转到 HSL/HSV。只需转换为灰度并将其用作“光”级。
  • kigurai,我觉得你有点不高兴,你不觉得吗?您的示例是边缘情况,对于这种情况,我建议了一种更全面的方法,该方法将涉及计算亮度分布,在您的情况下,亮度分布应该几乎是一条直线 - 对于渐变 - 文本颜色的窄带。
  • 极端情况与否(我不认为是),全局阈值将难以处理不均匀的照明,而照明不会以任何方式极端。您关于“计算分布”的建议可能听起来更好,但由于您仍在计算 全局 分布,因此与仅取平均值没有太大区别。抱歉,我仍然认为我的 -1 是准确的。 :)
【解决方案2】:

您是否尝试过使用形态学技术? Closure-by-reconstruction(如Gonzalez, Woods and Eddins 所示)可用于创建背景照明级别的灰度表示。您可以通过以下方式或多或少标准化有效照明:

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

2) 使用重构闭合来估计背景光照水平

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

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

基本上,通过重建关闭的作用是删除所有小于特定尺寸的图像特征,擦除“前景”(您要捕获的文本)并只留下“背景”(照明级别)。从原始图像中减去结果只会留下小尺度偏差(文本)。将原始平均强度添加到这些偏差中只是为了使文本具有可读性,从而使生成的图片看起来像原始图像的光归一化版本。

【讨论】:

    【解决方案3】:

    使用局部阈值而不是全局阈值算法。 将您的图像(灰度)划分为较小的图像网格(例如 50x50 像素),并对每个图像应用阈值算法。

    【讨论】:

      【解决方案4】:

      如果背景特征一般比字母大,可以尝试估计,随后去除背景。

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

      请注意,如果亮点远小于文本,则相反:选择过滤器窗口,使其仅移除光线。

      【讨论】:

        【解决方案5】:

        首先你需要尝试改变照明,使用圆顶灯或其他可以让你获得更加漫射甚至光线的灯光。

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

        here还有一个简单但有效的方法解释。算法的简单大纲如下:

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

        【讨论】:

          【解决方案6】:

          看起来您正在尝试做的是提高局部对比度,同时减弱更大规模的照明变化。我同意其他海报的观点,即通过更好的照明优化图像应该始终是第一步。

          之后,这里有两个技巧。

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

          这基本上从原始中减去了低空间频率信息,而保留了较高频率信息不变。

          2) 您可以尝试使用 highpass_image() 运算符或拉普拉斯运算符之一来提取渐变图像。

          【讨论】:

            猜你喜欢
            • 2023-03-31
            • 2021-01-04
            • 2015-10-01
            • 2013-04-03
            • 1970-01-01
            • 2019-06-28
            • 2014-09-16
            • 1970-01-01
            • 2012-11-03
            相关资源
            最近更新 更多