平场校正性能评估

本文最后更新于:2023年4月15日 晚上

之前介绍了图像的平场校正,没有细说精确的评估方法,本文记录相关内容。

评估思路

平场校正的目的是将均匀光照下的均匀材质校正到相同灰阶, 如果需要更高精度的评估,那就需要度量每个灰阶的像素点是否展示了在该二维平面上足够的均匀程度,也就是相同像素值的像素如果类似二维均匀分布产生的样本,那么就说明平场足够有效。

这个评估本质上是在度量一个数据集描述的分布与二维已知的均匀分布直接的距离,如果计算二者之间的 KL 散度你会发现落脚点会在度量数据集的熵上面,然而这看似简单的需求并不容易计算。

为了计算在已知二维平面上的均匀程度,需要将这些数据集转化为真正的分布,我的实践经验是将这些数据在二维平面上分块统计数量,形成二维平面上的统计直方图,归一化后就得到了他们的二维分布,之后就可以计算这个分布和均匀分布之间的距离了。

具体实现

实现思路

评估的是平场校正过后的白板图像,期望是所有灰阶像素都完全均匀分布,当然这是很难的。

需要评估当前灰阶像素分布与均匀分布的差距有多大,获取真实分布并不容易,我这里采取了近似的方法。

想要平场效果好,就需要逐个灰阶都均匀分布,那么考虑平均灰阶周围的几个灰阶范围内的数据,其余的当做不合理的灰度直接扔掉。

将图像分成面积相同的 $N$ ($N>1$)个均匀小块,对于每个灰阶 $I$,统计落在每个小块上的像素个数 $M_{I_{ij}}$,该个数除以灰阶像素数 $M_I$ 得到一系列概率值,这些值与均匀分布的概率 $\frac{1}{N}$ 相减,计算绝对值、求和作为初始 $Loss$:
$$
Loss = \sum |\frac {M_{I_{ij}}}{M_I} - \frac{1}{N}|
$$
该 $Loss$ 理论上的最小值为 0 (概率真的是均匀分布),最大值的情况为该灰阶所有像素都集中在一个块当中,其概率为 $[0,0,…,1]$,此时 $Loss$ 值为 $2-\frac{2}{N}$

为了让结果控制在 $[0, 1]$ 范围内,并且越接近于均匀分布结果越趋近于 1,定义得分:
$$
Score=1-\frac{Loss}{2-\frac{2}{N}}
$$
最后将各个灰阶的得分按照比例加权求和即得到最终分数。

Halcon 代码

函数定义:

1
FlatResultEva (flated_img :: interested_level_num : eva_res)

函数实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
gray_histo (flated_img, flated_img, AbsoluteHisto, RelativeHisto)
tuple_max (RelativeHisto, MaxValue)
tuple_find (RelativeHisto, MaxValue, maxIndices)
tuple_length (RelativeHisto, Length)
maxIndice := maxIndices[0]

get_image_size (flated_img, W, H)
image_area := W * H

eva_res := 0
max_size := 64.0

gen_rectangle1 (main_crop_matrix, 0, 0, H, W)
partition_rectangle (main_crop_matrix, PartitionedRegion, max_size, max_size)

for movement := -interested_level_num to interested_level_num by 1
cur_level := maxIndice + movement
if (cur_level < 0 or cur_level >= Length)
continue
endif
cur_weight := RelativeHisto[cur_level]
if (cur_weight <= 0)
continue
endif
pixel_num := AbsoluteHisto[cur_level]
if (pixel_num<2)
continue
endif

threshold (flated_img, Region, cur_level, cur_level)
tuple_pow (image_area / pixel_num, 0.5, size)

tuple_max ([max_size, size], size)

w_num := W / size
h_num := H / size

tuple_ceil (w_num, w_num)
tuple_ceil (h_num, h_num)

w_step := W / w_num
h_step := H / h_num

N := w_num * h_num

if (w_step = max_size and h_step = max_size)
intersection (PartitionedRegion, Region, Partitioned)
else
partition_rectangle (Region, Partitioned, w_step, h_step)
endif

region_features (Partitioned, 'area', Value)

Loss := Value / pixel_num - 1 / N
tuple_abs (Loss, Loss)
tuple_sum (Loss, Loss)
maxLoss := 2 - 2 / N
cur_score := 1 - Loss / maxLoss

eva_res := eva_res + cur_score * cur_weight
endfor

return ()

demo 使用:

1
2
3
4
5
ffc_result_img_path := 'test.png'
interested_level_num := 4

read_image (ffc_result_img, ffc_result_img_path)
FlatResultEva (ffc_result_img, interested_level_num, eva_res)

评估效果

灰阶抖动

灰阶抖动评价不能展现平场灰阶均匀程度

  • 以绿光平场平均图矫正蓝光单张图像为例

    灰阶抖动基本满足需求

  • 但同灰阶像素分布并不均匀

  • 如果用蓝光平场图矫正蓝光数据(匹配)

    灰度抖动很小,满足需求

  • 同灰阶像素分布均匀

  • 而且灰阶抖动受到明场亮度均值影响,可能在打光方面作弊

灰阶均匀程度度量

如果可以评价灰阶分布是否均匀,那么就可以设计更好的平场评估方案

  • 取核心灰阶(最高直方图左右若干灰阶)
  • 评估每个灰阶像素分布是否评价
  • 加权结合得到最终得分
  • 1 为完全匹配,0 为完全不匹配

不同打光平场图校正结果

暗场图不变,明场图分为 R, G, B, W, O(之前使用的平场图)

相互校正后评估算法得分:

均 值 平 场 图 →
得 分↘
被校正平场图 ↓
R G B W O
R 0.941 0.621 0.408 0.549 0.264
G 0.607 0.940 0.547 0.770 0.234
B 0.405 0.544 0.949 0.585 0.172
W 0.538 0.783 0.592 0.941 0.221
O 0.256 0.228 0.166 0.216 0.999
  • 对于当前的数据来说,这套评价方法可以有效区分出合适的平场校正基准均值图

参考资料



文章链接:
https://www.zywvvd.com/notes/study/camera-imaging/ffc-eva/ffc-eva/


平场校正性能评估
https://www.zywvvd.com/notes/study/camera-imaging/ffc-eva/ffc-eva/
作者
Yiwei Zhang
发布于
2023年3月4日
许可协议