大多数浏览器和
Developer App 均支持流媒体播放。
-
确保拍摄的画面在颜色上保持一致
了解 Constant Color API,并探索该 API 如何帮助用户使用你的 App 来确定精准的颜色。你将学习如何采用该 API,了解它在科研和营销方面的潜力,并探索充分利用这种技术的推荐做法。
章节
- 0:00 - Introduction
- 2:03 - What is color constancy?
- 7:42 - How Constant Color works
- 9:30 - Code examples and demos
- 20:39 - Validation
资源
相关视频
WWDC23
WWDC22
WWDC21
-
下载
欢迎观看“确保拍摄的画面 在颜色上保持一致” 嗨!我叫 Yuko 我们都知道 iPhone 能 拍出让人身临其境的精彩照片 而光线的质量以及它如何 与场景中物体和人物的 颜色及纹理交相呼应尤为重要 这些因素能很好地帮助你重温 用 iPhone 记录的珍贵瞬间 我们来看几个示例 非洲大草原上的日落 如果少了温煦的余辉 又怎会完整 在斑驳的金色光影下 秋天的落叶显得格外绚丽 室内的暖光与室外的冷光 形成鲜明的对比 让这家酒吧更显温馨舒适 清晰的定向光照 让 Matt 看上去意志坚定 在这场植物灯光秀中 强烈的饱和光线 构成了这张照片的精髓 在这些场景中 水面上落日的倒影 给照片注入了一丝神秘 而这些场景中光影之间的对比 则可烘托氛围、引人注目 这些例子都很好地说明了 环境光是照片美学的一个重要因素 通常 这便是我用 iPhone 拍照时想要达到的效果 但有时 环境光的效果并不理想 甚至会分散注意力 比如在拍摄皮肤照片时 例如 你可能想记录 伤口的愈合情况 因此希望关注 伤口周围的皮肤颜色 而不想受到环境光的影响 在本例中 整个瘀伤区域 在 Constant Color 图像中 看起来更为明显 这类照片正是 Constant Color API 的用武之地 下面 我们来深入探究一下 在本讲座接下来的部分 我会介绍什么是颜色恒常性 举例说明合适的应用场景 还会讲解 Constant Color 的工作原理 然后 我们会探索一些示例代码 还会穿插进行现场演示 最后 我会介绍如何 验证 Constant Color 功能 那么 什么是颜色恒常性呢? 它是人类视觉感知机制的一个特性 如果你知道某一物体的颜色 那么 无论你在何种环境光照 条件下观察这个物体 你都会将物体的颜色 视为已知的那个颜色 例如 一个亮绿色的青苹果 无论是在日光下还是 在营火的暖光下进行观察 对你来说 它始终都是绿色 这是因为人类会自动适应 周围的光照条件 并对部分环境光照效果进行修正 人类大脑可识别先前已见过的物体 并记住物体的颜色 Constant Color 功能 提供了一种新的拍摄模式 它可确定物体、人物和材料的颜色 而无须依靠先前的拍摄记忆 进行识别 在很多用例中 我们都需要始终如一地 拍摄记录场景中人物和物体的颜色 而无论环境光照如何 在这里 我想着重介绍两种用例: 产品摄影和皮肤照片 Constant Color 成像 对于产品营销照片非常重要 尤其是当消费者在网上购买 还未见过实物的产品时 浏览网店产品时 我通常会看到两种类型的照片 第一种是展现消费者 如何享用产品的 精美照片 iPhone 已经可以完美满足 这类照片的需求 通过常规拍照模式和人像模式 就能达到理想的效果
第二种照片则可帮助消费者评估 产品的特性 例如尺寸和颜色 Constant Color 可帮助顾客 更好地了解产品的颜色 因为它能采用一致的光照条件 来生成照片 这些在已知光照条件下 拍摄的图像具有一致性 可与用户设备上经过 色彩管理的显示屏配合使用 而无论用户使用的设备是 手机、平板还是电脑 因此 顾客在各种条件下 查看照片时 都能准确了解产品的颜色 所有这些都可以 帮助顾客更好地想象 产品在家中、办公室、车上 或工作场所的实际效果 这有助于顾客做出明智的购买决定 从而推动顾客满意度的提升
我们都曾有过这样的经历 在网上下单买了一些衣服 但收到衣服后却发现 实物与预期存在差距 下面我会以盆栽为例 来说明这个问题 大型制造商和专业产品摄影师 会在专业的摄影棚内 拍摄这类照片 同时还会动用 许多重量级灯光设备、 摄影背景和数码相机 规模较小的公司和居家创作者 则可能会使用灯箱 来控制产品照片的照明条件 令人高兴的是 我们已经能够 将摄影棚和灯光设备的强大功能 融入到你的 iPhone 中 这都要归功于人像模式 以及新的 Constant Color API 我们来看一个例子
这里有一盆紫罗兰 我想拍出绚丽的色彩 如你所见 这只是一个普通的房间 室内有暖白色的照明 而无特殊的灯光设备 下面我们来看一些照片 左边是用 iPhone 15 在普通模式下拍摄的照片 右边则是 Constant Color 图像 它整体呈现出更为中性的光影 甚至还有色调 现在 我们来增加点难度 在这个场景中再添加一道 强烈的彩色光线 现在 我们很难判断 这个花盆是中性色还是陶土色 如果我们观察右边的 Constant Color 图像 则会看到 相比于前一张照片 前景中的紫罗兰 在色调和光影方面基本没有变化 事实上 我可以向这个场景 添加任意颜色的饱和光 从而得到很好的效果 最左边的图像仅有 较为中性的室内照明 而在其他图像中 我向室内照明分别添加了 红色、绿色和蓝色的饱和光 这些经过了标准美学管道处理的图像 展现了环境光所产生的光影效果 这正是常规拍摄模式 期望达到的效果 再来看看这些图像下面的 Constant Color 图像 我们在不同光照条件下 实现了相当一致的渲染效果 这些例子展示的强烈彩色光线 属于非常极端的情况 但不用担心:Constant Color 也可校正细微的光影 如果你认为我们是为这场讲座 而刻意优化了这些图像 可以仔细观察一下突出显示的区域 你可以看到 在叶子的阴影中 这些光影并没有完全得到修正 稍后 我们将讨论 为何会出现这种情况 当然 这项功能也可准确捕捉 人物颜色和肤色 这对于监测皮肤色调 在一段时间内的变化尤为有用 正如我们在先前 同样的光照条件下所见 Constant Color 会在不同光照条件下 以高度一致的方式 对这四种不同肤色进行渲染 记住肤色随时间推移而发生 的变化可能并不容易 尤其是当这种变化较为缓慢时 或者当你在不同光线条件下 查看肤色时 因此 如果你曾想知道 淤伤是已开始消退还是仍在变暗 拍一张 Constant Color 照片 会比注重美感的照片更为有用 如果你曾想知道皮疹 或蚊虫叮咬部位是否变得更红了 相比于常规拍摄 Constant Color 成像技术 可生成更适合这种用途的照片 如本例所示 在色温为 2800K 的超暖室内光下 注重美感的照片 会让杯状痕迹显得格外严重 单张图像中的绝对颜色 以及颜色随时间变化的演变过程 都可提供有价值的信息 对于肤色较深的人物来说更是如此 这是因为 他们肤色的变化 相比于肤色较浅的人物可能更为细微 当然 不同肤色间的表现能力 对于我们的产品至关重要 因此我们会在本次讲座的 稍后环节聊聊验证问题 现在 我们来深入了解一下 Constant Color 功能 如何生成这些图像 Constant Color API 利用了 iPhone 14 系列手机中 率先推出的改进型闪光灯硬件 每部 iPhone 的闪光灯特性 都会在生产过程中进行精密测量 同样 每个摄像头的特性 也会进行仔细测量 在完全黑暗的房间内 闪光灯会成为照片中的唯一光源 在这个场景下 我们已知 摄像头和光源的特性 因此可以准确地确定 照片中物体和材料的颜色 在非完全黑暗的环境中拍照时 Constant Color API 会分析 闪光灯导致的亮度增加 根据这个数据来预测黑暗房间中的 等效图像会是怎样的效果 为此 这个 API 会先拍摄 一张闪光灯图像 紧接着快速拍摄一张非闪光灯图像 从而将场景或光照条件的变化最小化 然后 环境光图像会与闪光灯图像 进行对齐 以减少位移的影响 并确保图像中的相应区域 具有相同的内容 接下来 在线性场景参照域中 两张图像会根据相对曝光度 进行归一化处理 这样便可进行两帧之间的比较 通过使用计算摄影技术和机器学习 两张图像会与闪光灯和摄像头的 精密出厂校准数据一同进行处理 这种处理产生的结果便是 能够预测出等效的黑暗房间图像 会是怎样的效果 最后 系统会模拟 D65 标准光源 对这个黑暗房间图像进行渲染 接着 图像会接受全局色调映射 和 2.2 伽马编码 为了保留整个视场中 材料亮度的细微变化 系统不会应用任何局部色调映射 现在 我们看看如何在你的 App 中 拍摄 Constant Color 图像 有六个要点需要注意 首先 请确保设备支持 Constant Color API 其次 必须将管道配置为能够处理 潜在的 Constant Color 请求 第三 要触发 Constant Color 照片 必须设置 AVCapturePhotoSettings 属性 这个 API 提供了两种机制来识别 Constant Color 图像的哪些部分 具有高精度颜色 哪些部分在颜色渲染方面 可能存在更大的差异 首先是 2D 置信图 稍后我会详细介绍这一点 另一种机制是单一的汇总置信值 最后 有一个用于提供回退帧的选项 当 App 决定不使用 Constant Color 图像时 就可以选择这个回退帧 好了 现在我们来看几个示例代码 首先是检查设备支持
这段代码来自新的 Constant Color 相机示例 App 这个示例项目可以在 Apple Developer 网站上找到 在本讲座接下来的讲解中 我都会引用这个示例 App 为了检查你的目标设备是否支持 Constant Color API 我们需检查一个 AVCapturePhotoOutput 属性 具体来说便是 isConstantColorSupported 属性 请注意 如果切换摄像头或格式 这个属性可能会改变 就设备而言 目前支持的机型有 iPhone 14 系列、 iPhone 15 系列以及 2024 年推出的 iPad Pro 系列 检查设备是否支持 Constant Color 后 下一步便是配置 AVCapture 管道 以便能生成 Constant Color 图像 由于需要预闪光序列 因此 Constant Color 是一种仅拍照模式 设备类型需为 builtInWideAngleCamera 或 builtInDualWideCamera AVCaptureSession sessionPreset 也需进行相应设置 Constant Color 会使用闪光灯 因此只有当 AVCaptureFlashMode 设为 auto 或 on 时 它才会正常工作 将 flashMode 设为 off 会导致 发起 Constant Color 图像请求时 出现异常
此外 Constant Color API 不支持拍摄 RAW 图像 因此 rawPhotoPixelFormatType 需设为 0 Constant Color API 是一种可重复的拍摄模式 因此它不支持不同的画质设置 它对所有优先级设置具有 相同的运行时和输出 现在 我们回到代码片段来看一下 可以看到 sessionPreset 已经配置好了 AVCapturePhotoOutput 设置中 也配置了闪光灯模式 这一点 稍后我们会进行介绍 最后 需要设置 isConstantColorEnabled photoOutput 属性 在这段示例代码中 isConstantColorEnabled 属性通过 isConstantColorSupported 属性 进行设置 以便仅在设备支持 Constant Color 时启用这项功能 请注意 更改 isConstantColorEnabled 属性 会触发渲染管道的重新配置 而这个过程非常耗时 因此建议在 App 启动时 一次性设置这个属性 并且将其他所需的 管道设置一起完成
确认设备支持 Constant Color API 并配置管道后 需要指定希望何时生成 Constant Color 图像 我们来看一段新的代码 同样来自 Constant Color 相机示例 App AVCapturePhotoSettings 中的 每次拍摄设置需在这里配置 闪光灯模式根据 UI 开关的状态进行设置 还要通过设置 isConstantColorEnabled 属性 来请求 Constant Color 图像 这段代码中 isConstantColorEnabled 属性与 UI 开关相关联 如果未设置这个属性 管道则默认生成 注重美感的常规照片 好了 现在来现场演示一下! 为了让演示更有趣 我来设置一个 有挑战性的光照场景
我们来比较一下 Constant Color 成像模式 与美学摄影模式在输出上有何差异
我要使用 Constant Color 相机示例 App 拍一张常规照片
iPhone 捕捉到了我手部 和色彩校正卡上微妙的颜色变化 这是由多个光源引起的 从美学角度来看 这种效果很棒 也是我在记录回忆时 想要达到的效果 比如我儿子在烛光下 吹生日蜡烛的照片 现在 我会在示例 App 中激活 Constant Color
我们来拍张照 由于我们使用了闪光灯 因此会有正常预闪光 和闪光拍摄序列 完成后 便可生成 Constant Color 图像
看看我的肤色在整个图像中 有多么均匀 色彩校正卡在整个画面中 呈现出中性色调 当然 无需借助色彩校正卡 就能使用 Constant Color API 实际上 不必在照片中放置 任何参考材料或图表
我把色彩校正卡拿走 再拍一张图像 而我的肤色 和桌面仍然保持一致的渲染效果
接下来 我会深入探讨这个 API 的 一致性是如何得到保证的 并在稍后介绍如何加以验证
如前所示 Constant Color 会使用闪光灯 具体来说 它会测量 闪光灯将场景提亮了多少 然后对这个亮度提升量进行分析 iPhone 闪光灯经过精心优化 可平衡光输出功率、物理大小 和电池用量 因此 在某些拍摄条件下 闪光灯可能不足以充分照亮场景 这就导致 Constant Color API 无法分析出差异 在这种情况下 由 Constant Color API 生成的颜色 在一致性方面可能有所下降 闪光灯不够亮的示例情况包括 拍摄风景照、天文摄影 或是在阳光直射下拍照等场景 Constant Color API 提供了 一系列工具来检测渲染的颜色 可能不太准确的情况 以便你通过 App 提供一种备用流程 对于每张 Constant Color 照片 这个 API 都会分析 图像的每个部分 以查看闪光灯的亮度提高 是否达到足够的信噪比 以及是否存在因反射而造成的裁剪 这会生成一个置信图 而这个图会作为第二个 CVPixelBuffer 输出 你的 App 可以分析这个置信图 从而确定感兴趣的图像区域 是否具备较高的置信值 置信图是一个由浮点值 构成的 2D 图 这些值的范围介于 0 到 1 这个图中的每个像素都对应于 Constant Color 照片的一部分 constantColorConfidenceMap 中的值为 1 表示对图像中这个点的准确度 完全置信 值为 0 则表示没有置信度 App 的阈值对于你的用例 具有唯一性 我建议阈值从 0.8 到 0.9 开始 然后在此基础上进行微调 稍后 我们将在下一演示中 看到一些这样的置信图 在确定感兴趣区域 是否具有准确的颜色时 置信图是最详细的信息来源 但有的时候 你可能更想检查单个值 而不是 2D 图 为此 我们创建了置信图的 汇总统计数据 constantColorCenterWeightedMeanConfidenceLevel 属性 可用于感兴趣区域未知的情况 或是作为一个指示性指标 来确定是否应进行 更详细的置信图分析 它是一个加权平均值 而图像的中心像素影响更大 这是因为用户往往 会在中心框定拍摄主体 还有其他方法可将 2D 置信图 简化为单个值 如果你的 App 需要这个值 则可通过 2D 图进行计算 在 Constant Color 相机示例 App 中 中心加权置信值 会显示在置信图上方 如果拍摄画面的置信值 不符合 App 的阈值 该怎么办? 你可重新拍摄这个图像 也可使用可选的环境光回退照片 我们来详细看看 要选择使用回退功能 你只需在拍摄前设置 AVCapturePhotoSettings 的 isConstantColorFallbackPhotoDeliveryEnabled 属性 在示例代码中 这个属性 也会通过 UI 开关来控制
通过选择接收回退帧 会触发两次 didFinishProcessingPhoto 回调 这是示例 App 中 相关委托的对应代码 在这个回调中 可以看到 系统会检查 isConstantColorFallbackPhoto 属性 从而确定正在接收的照片 是回退照片 还是 Constant Color 照片 让我们通过第二个演示 来看看实际效果
首先 我会重复执行先前 将我的手放在桌上的那个试验
在这里 我们会看到一张 与之前类似的图像 这时 我的手在桌面上 会呈现为中性色 而如果我轻扫到置信图 则会看到几乎全白的图 只有在我的手投射阴影的地方 有一些细微的阴影 这是由于闪光灯 和摄像头之间的基线产生的 现在 我们来看看保持一定距离 闪光灯无法照亮背景时又会怎样
这里是 Constant Color 输出的结果 闪光灯强度会自动设为 照亮我的手部 同时避免过度曝光 所以 背景便不会被闪光灯完全照亮 我手部的肤色看起来仍然非常一致 如我所料 置信图显示 我的手部具有较高置信值 但背景的置信值却较低 你可在 App 中 使用置信图来确定 对你而言十分重要的 某一图像部分是否 具有准确的颜色 现在 我们有必要回看一下 Constant Color 输出 请注意 即使背景的置信值较低 整个图像仍有不错的呈现效果 而不会出现怪异的颜色 或过多的噪点 这是因为 Constant Color API 会在系统计算亮度差异之前 使用来自闪光灯的信息 来弥补图像中的不足 因此 即便 Constant Color 输出的 某些区域置信值较低 整个图像仍可以呈现不错的效果 现在 我们来看看当闪光灯 产生镜面反射时 会是什么情况
在 Constant Color 图像中 我们能清楚地看到 勺子上有强烈的闪光灯反射 在这些区域 我们无法 准确测量亮度差异 因为闪光灯照明出现了散射 或是像素值超出了范围 这个现象在置信图中十分明显 因为对应区域内没有勺子 这是因为耀眼的反射 已被报告为具有较低置信值 置信值较低的原因在于 散射和像素超出范围造成了妨碍 导致难以确定精确的亮度增幅
现在 你可能想知道 Constant Color API 图像 到底有多准确 我们在各种室内照明场景下 测试了这个 API 照度范围从 10 到 800 勒克斯 测试场景跨度极大 相当于 从一个难以拍照的黑暗环境 到类似于手术室的高亮度室内环境 在每个照度级别 色温都会从 3000K 暖色 变化为 7500K 冷色 在每个亮度和照度级别 我们测试了普朗克白点、 品红色调和绿色色调 跨越色轴的表现 对于每种光照条件 我们都拍摄了 包含较强饱和颜色、中性色调、 植被和肤色的 Calibrite ColorChecker 图像 同时 我们还拍摄了 Pantone 肤色指南 其中包含 138 种肤色 涵盖各种反照率和底色 当然 我们还拍了真人 对于这些数据 我们将 Constant Color API 的 P3 RGB 输出 转换为 CIEL*a*b* 色彩空间 并计算了各种照明条件下 每种颜色的变化值
与注重摄影效果的 常规 iPhone 拍摄模式相比 Constant Color API 可显著 提高图像渲染的可重复性 对于 iPhone 15 系列 因环境光而产生的 表面颜色差异已减少 87% 请参阅即将发布的白皮书 了解相关验证方法和准确度 的详细信息 对了 最后一点 由于 Constant Color 预测的是 在没有环境光的黑暗房间中 使用闪光灯拍出的图像 因此 场景中由环境光投射出的阴影 会在最终图像中 显著减少或完全消除 左边是 iPhone 常规拍摄的照片 其中能清晰看到我的手和 iPhone 投射的阴影 右边则是已移除阴影的 Constant Color 输出 相信看过 2024 年 iPad 发布会的观众 或许会发现这些结果有些眼熟 这是因为 对于新的 iPad Pro 文稿扫描功能而言 Constant Color 是必不可少的 阴影去除工具 值得注意的是 文稿扫描功能使用的 constantColorCenterWeightedMeanConfidenceLevel 阈值为 0.9
现在 我们来总结一下 本场讲座的内容 Constant Color 是一种全新的拍摄模式 这个模式会优先保留 照片中物品的颜色 而不是光线所营造的情调和氛围 我们无需在这个场景中 放置已知材料或卡片 即可测量颜色 Constant Color 图像 具有高度可重复性 可以缓解不同室内照明 对图像产生的影响 环境光产生的阴影 会在 Constant Color 图像中 相应减少 甚至完全消除 这个 API 可提供详细的 置信图和回退图像 以便你能在 App 中控制和从容 使用 Constant Color 图像 我们很自豪能发布这个 全新拍摄模式 无比期待大家借此创造的精彩 感谢观看!
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。