有许多扫描仪允许在其设置中设置图像伽玛,但不幸的是,此伽玛在扫描仪软件中调整,而不是在扫描仪端调整(通过模拟方式或至少使用分辨率高于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。
有什么想法吗?
答案 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
此公式允许我们检测应用的伽马校正。我会:
如果您最初的想法有效,这应该会很好。请注意,有些事情可能会搞砸了: