【问题标题】:Determine image gamma by skipped levels通过跳过的级别确定图像伽玛
【发布时间】:2018-01-24 20:57:58
【问题描述】:

有许多扫描仪允许在其设置中设置图像伽马,但不幸的是,此伽马是在扫描仪软件中调整的,而不是在扫描仪端(通过模拟方式或至少使用分辨率超过 8 位的 ADC) .比如说,我们最初从扫描仪得到线性响应,所以 255 是最大亮度,128 是亮度的一半,以此类推,然后图像通过 LUT:

0 -> 0,
1 -> 21,
2 -> 28
...
127 -> 186,
128 -> 186,
...
254 -> 255,
255 -> 255

问题是:我们得到了一些带有未知伽马设置的扫描页面,并希望自动处理它们,而不需要人工仔细检查。

我们想检测缺少某些特定亮度级别的图像(这里,gamma=2,2 我们错过了 1..20、22..27 等),并基于此分配相应的 gamma图像的价值,所以它会在之后被正确处理。顺便说一句,我们会提醒用户信息会因为这种伽马转换而丢失,因此用户应该尽可能将其关闭。

确定这种最常见的 gamma=2.2 情况非常容易,我们只需检查相应的零即可。 Gamma=1 也很容易:在这种情况下,我们应该完全没有失误。

但这将是最优雅的解决方案,不仅可以确定这些情况,还可以通过缺少唯一值来确定任意 gamma。例如,gamma=1,01 具有除 20 之外的所有值。在 gamma = 1,2(Plustek Opticbook 扫描仪喜欢灰度图像的这个值)我们有 1、2、5、7、9、12,...缺失,等等。

有一个问题:有时可能会丢失一些低值和高值,因为我们在页面上没有额外的白色或额外的黑色区域,所以我们应该切断这些“尾巴”并只处理内部缺失的级别。

我们可能会花费大量时间来构建某种决策树,但随后所有处理都应该尽可能快:这些图像的负载为 600 dpi 分辨率。

有什么想法吗?

【问题讨论】:

    标签: algorithm image-processing


    【解决方案1】:

    只是因为它更容易,我将讨论从 0.0 到 1.0 而不是 0 到 255 的级别,所以你的伽马校正是这样的:

    out = in^(1/γ)in = out^γ

    在有足够像素来检测由伽马校正引起的直方图零点的输出亮度区域中,没有像素的级别的比例取决于输入和输出曲线的相对斜率。

    empty_level_proprotion(out) = max( 1 - din/dout , 0 )

    替换 dout/din 得到:

    empty_level_proprotion(out) = max( 1- (γ * out^(γ-1)) , 0 )

    对于 gamma 2.2,它看起来像这样:

    https://www.wolframalpha.com/input/?i=plot+max(1-(2.2%2Ax%5E(1.2))+,+0)++from+0+to+1

    这个公式允许我们检测应用的伽马校正。我会:

    1. 将图像直方图划分为 32 个亮度带
    2. 删除所有没有足够像素的波段。例如,需要 20 倍于波段中不同级别的像素
    3. 计算每个波段中没有像素的级别数
    4. 将上述公式生成的曲线与剩余数据进行拟合,以找到最能解释数据的伽玛值。

    如果您最初的想法可行,那应该会很有效。请注意,有些事情可能会搞砸:

    • 它不适用于 JPEG 压缩图像,因为它们会填充缺失的级别
    • 如果扫描仪在进行伽马校正之前对相同的 8 位数据进行了白平衡、对比度或亮度修复,那么这些操作可能会通过引入更多缺失的级别来混淆数据。这基本上只是将上面的 1 更改为每个颜色通道的不同值,因此如果您使曲线拟合更复杂,您可以检测到这一点。

    【讨论】:

      猜你喜欢
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2018-01-29
      相关资源
      最近更新 更多