第四章:数据采集实操——亮度计参数设置、自动扫描脚本编写、数据导出与格式转换、异常值剔除

好,咱们进入实操环节。前面讲了那么多理论,说白了都是为了这一刻——真正上手采集数据。我记得第一次带新人做亮度均匀性测试时,小伙子把亮度计架好就开始扫,结果数据出来全是乱的。为什么?参数没设对。

这一章,我带你走一遍完整的流程。从亮度计参数设置,到写自动扫描脚本,再到数据导出和异常值处理。每一步都有坑,我尽量把踩过的坑都告诉你。

4.1 亮度计参数设置——别小看这一步

亮度计不是开机就能用的。你想想看,不同VR头显的亮度范围、色温、刷新率都不一样,参数设不对,数据就是废的。

4.1.1 核心参数有哪些?

参数名称 推荐设置 说明
测量模式 点测量 / 阵列扫描 均匀性测试建议用阵列扫描
积分时间 100ms ~ 500ms 根据亮度自动调整,太短噪声大
视场角(FOV) 1° ~ 2° 匹配VR镜头的出瞳直径
色温匹配 D65(6500K) 标准白场测试用
触发方式 软件触发 / 外部触发 自动扫描建议用软件触发

我个人习惯先把积分时间设到200ms,然后看实时读数。如果亮度值跳动超过±2%,就把积分时间加长。我在项目中遇到过一款Micro-OLED头显,亮度只有80nit,积分时间设到800ms才稳定下来。

注意:积分时间不是越长越好。太长的话,测量效率会大幅下降。一个9×9的扫描点,积分时间从100ms加到500ms,总耗时从9秒变成45秒。VR头显的亮度漂移可能在这段时间内就发生了。

4.1.2 白平衡校准

做亮度均匀性之前,先做白平衡校准。这个步骤很多人跳过,但我不建议。为什么?因为亮度计对不同波长的光敏感度不一样,不校准的话,测出来的亮度值会有系统偏差。

具体做法:

  • 用标准光源(比如Labsphere的均匀光源)做参考
  • 在亮度计软件里输入标准光源的亮度值和色坐标
  • 让软件自动计算修正系数

嗯,这一步做完,后面测出来的数据才有说服力。

4.2 自动扫描脚本编写——解放双手

手动测9个点还行,要是测25个点、49个点呢?手都酸了。所以必须写脚本。

我常用的亮度计是Konica Minolta的CS-2000和Topcon的SR-3AR。这两款都支持SCPI指令,通过串口或以太网控制。

4.2.1 脚本框架

下面是一个Python脚本的骨架。我用的是pyvisa库,兼容性比较好。

import pyvisa
import time
import numpy as np

# 连接亮度计
rm = pyvisa.ResourceManager()
meter = rm.open_resource('TCPIP0::192.168.1.100::inst0::INSTR')

# 设置参数
meter.write('MEAS:INT 200')  # 积分时间200ms
meter.write('MEAS:FOV 1')    # 视场角1°

# 定义扫描点(9点法)
points = [
    (0, 0),     # 中心
    (-30, 0),   # 左
    (30, 0),    # 右
    (0, -30),   # 下
    (0, 30),    # 上
    (-30, -30), # 左下
    (30, -30),  # 右下
    (-30, 30),  # 左上
    (30, 30)    # 右上
]

results = []

for (x, y) in points:
    # 移动平台到指定位置(假设有电动位移台)
    stage.move_to(x, y)
    time.sleep(0.5)  # 等待稳定
    
    # 触发测量
    meter.write('MEAS:STAR')
    time.sleep(0.3)  # 等待测量完成
    
    # 读取数据
    data = meter.query('MEAS:DATA?')
    results.append((x, y, float(data)))
    
    print(f'点 ({x}, {y}) 亮度: {data} cd/m²')

# 保存结果
np.savetxt('brightness_data.csv', results, delimiter=',', 
           header='x,y,luminance', comments='')
小技巧:我在脚本里加了0.5秒的延时,这是为了等位移台稳定。有一次我偷懒把延时改成0.1秒,结果数据波动很大。后来发现是平台还没停稳就开始测了。别省这点时间。

4.2.2 扫描路径优化

扫描路径怎么走?我见过有人用Z字形,有人用螺旋形。我个人推荐用光栅扫描——从左到右,从上到下。这样数据在空间上是连续的,后期做热力图很方便。

但要注意:VR头显的亮度会随时间漂移。如果扫描时间太长(超过30秒),头显可能已经热起来了,亮度会下降。这时候就需要做时间补偿。

我曾经做过一个测试:连续测60分钟,每5分钟记录一次中心点亮度。结果发现前10分钟亮度下降了8%,之后才稳定。所以,如果你要测大量点,最好先做预热,或者用短积分时间。

4.3 数据导出与格式转换——别让数据烂在仪器里

数据测完了,怎么导出来?不同亮度计的导出方式不一样。

4.3.1 常见导出格式

格式 适用场景 优点 缺点
CSV 通用 兼容性好,Excel能直接打开 不支持元数据
XLSX 报告生成 支持多Sheet、图表 文件较大
HDF5 批量处理 支持大数据量、元数据 需要专用库
JSON Web应用 结构化好 可读性差

我个人习惯用CSV。简单、直接、不依赖任何软件。但要注意编码问题——中文路径名有时会乱码,建议全用英文。

4.3.2 格式转换脚本

有时候客户要XLSX格式,有时候要JSON。写个转换脚本一劳永逸。

import pandas as pd
import json

# 读取CSV
df = pd.read_csv('brightness_data.csv')

# 转成XLSX
df.to_excel('brightness_data.xlsx', index=False, sheet_name='亮度数据')

# 转成JSON
data_dict = df.to_dict(orient='records')
with open('brightness_data.json', 'w') as f:
    json.dump(data_dict, f, indent=2)

print('转换完成!')
关键点:转换时保留原始数据。不要做任何四舍五入或平滑处理。原始数据是证据,处理后的数据是结论。两者要分开保存。

4.4 异常值剔除——数据清洗是必修课

数据采完了,你以为就结束了?不,还有最重要的一步——异常值剔除。

为什么会出异常值?我遇到过的情况:

  • 位移台抖动导致测量位置偏移
  • 亮度计镜头上有灰尘
  • VR头显突然闪了一下(刷新率同步问题)
  • 电磁干扰导致通信错误

4.4.1 异常值检测方法

常用的方法有三种:

  1. 3σ法则:计算所有数据的均值和标准差,超出均值±3σ的视为异常。适合正态分布的数据。
  2. IQR方法:计算四分位距,超出Q1-1.5×IQR或Q3+1.5×IQR的视为异常。对偏态分布更鲁棒。
  3. 局部异常因子(LOF):基于密度的异常检测。适合空间数据,比如亮度分布图。

我一般先用3σ法则快速过滤,再用LOF做精细检查。为什么?因为3σ法则简单,但会把边缘区域的正常低亮度误判为异常。VR头显的边缘亮度本来就低,你把它剔除了,均匀性反而变好了——这不科学。

警告:不要自动剔除异常值!一定要人工确认。我曾经写了一个自动剔除脚本,结果把边缘区域的正常数据全删了,均匀性从85%变成了92%。老板很高兴,但我知道那是假数据。后来我改了脚本,每次剔除前都生成一个报告,人工审核后再执行。

4.4.2 异常值处理流程

我的标准流程是这样的:

  1. 用3σ法则标记潜在异常值
  2. 生成异常值报告(包含位置、原始值、判定依据)
  3. 人工检查每个异常值(看原始测量日志、看测量位置照片)
  4. 确认是异常后,用插值法替换(线性插值或样条插值)
  5. 记录替换日志(谁、什么时间、为什么替换、替换成什么)

嗯,最后一步很重要。数据溯源是质量体系的要求。万一客户问起来,你得能说清楚每个数据是怎么来的。

4.5 本章知识体系

下面这张图总结了数据采集的完整流程。你可以把它贴在工位上,每次做测试前看一眼。

数据采集实操流程 步骤1:参数设置 积分时间·FOV·色温 步骤2:脚本编写 SCPI指令·扫描路径 步骤3:数据采集 自动扫描·实时监控 步骤4:数据导出 CSV·XLSX·JSON 步骤5:格式转换 Pandas·批量处理 步骤6:异常值剔除 3σ·IQR·人工审核 ✅ 清洁数据输出 异常值反馈至参数调整 每个步骤都需要记录日志,确保数据可追溯 关键指标: 扫描点数 ≥ 25 测量重复性 ≤ 2% 异常值比例 ≤ 1% 人工审核率 100%

这张图把整个流程串起来了。从参数设置到清洁数据输出,每一步都有对应的工具和方法。你照着这个流程走,基本不会出大问题。

好了,数据采集这部分就讲到这里。记住:参数设对、脚本写好、数据导全、异常剔净。这四步做到位,你的亮度均匀性数据就是可靠的。


专注资料整理