跳过级别

时间:2017-08-16 16:01:01

标签: algorithm image-processing

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

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

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

我们想检测那些丢失了一些特定亮度级别的图像(这里,伽玛= 2,2我们错过了1..20,22..27等),并根据它来分配相应的伽马值对图像,因此它将在之后正确处理。顺便说一句,我们会提醒用户由于此伽马转换而导致信息丢失,因此用户应尽可能将其关闭。

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

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

有一个问题:有时可能会丢失一些低值和高值,因为我们在页面上没有额外的白色或额外的黑色区域,所以我们应该切断这些'尾巴'而只能使用内部错过的水平。

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

有什么想法吗?

1 个答案:

答案 0 :(得分: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. 将上述公式生成的曲线与剩余数据拟合,以找到最能说明数据的伽玛值。
  5. 如果您最初的想法有效,这应该会很好。请注意,有些事情可能会搞砸了:

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