2017-08-16 33 views
0

有许多扫描仪可以在其设置中设置图像伽玛,但不幸的是,这个伽玛可以在扫描仪软件中进行调整,而不是在扫描仪侧进行调整(通过模拟方式或至少使用更多分辨率不仅仅是8位)。比方说,我们从扫描器的线性响应最初,所以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 = 2.2的情况,我们只是检查相应的零。 Gamma = 1也很容易:在这种情况下,我们应该完全没有失误。

但是,这将是最优雅的解决方案,以确定不只是这些情况下,但由独特的价值缺失任意伽马。例如,gamma = 1,01除了20以外的所有值。在gamma = 1,2(Plustek Opticbook扫描仪喜欢灰度图像的这个值)时,我们有1,2,5,7,9,12,...缺失, 等等。

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

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

任何想法?

回答

1

只是因为它更容易,我要谈的水平从0.0到1.0,而不是0到255,所以你的伽玛校正是这样的:

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

empty_level_proprotion(下)=最大(1 - DIN/DOUT,0)

DOUT/DIN给我们:

empty_level_proprotion(下)= MAX(1-(γ *总分^(γ-1)),0)

对于伽马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位数据,那么这些操作可能会通过引入更多的缺失级别来搞乱数据。这基本上只是将上面的更改为每个颜色通道的不同值,所以如果您使曲线拟合更加复杂,则可以检测到这一点。