You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS平台如何利用semanticSegmentationSkyMatteImage生成天空遮罩?

解决iPhone图片天空语义遮罩的问题

首先明确几个关键前提:

  • 天空语义分割的AVSemanticSegmentationMatteType.sky是iOS 15.0及以上才引入的,WWDC2019的225号视频只覆盖了人物相关的分割类型(头发、皮肤等),这就是你看不到Sky类型的核心原因。
  • 硬件上需要搭载A12仿生及以上芯片的设备(比如iPhone XS/XR及以后机型)才支持实时捕获天空遮罩。

正确的捕获流程

如果你的设备和系统版本符合要求,修改捕获代码如下:

// 先判断是否支持天空分割类型
if #available(iOS 15.0, *), self.photoOutput.availableSemanticSegmentationMatteTypes.contains(.sky) {
    photoSettings.enabledSemanticSegmentationMatteTypes = [.sky] // 也可添加其他需要的分割类型
    photoSettings.embedsSemanticSegmentationMattesInPhoto = true
}

建议不要直接赋值availableSemanticSegmentationMatteTypes,单独指定.sky能减少不必要的资源占用。

加载天空遮罩

拍摄并保存为HEIC格式后,加载遮罩的代码是正确的,但要确保图片确实嵌入了天空遮罩:

if #available(iOS 15.0, *) {
    let skyMatte = CIImage(contentsOf: imageURL, options: [.auxiliarySemanticSegmentationSkyMatte: true])
    // 可将skyMatte转为UIImage或用于后续图像合成
}

简便替代方案(无需捕获时嵌入遮罩)

如果你的场景不需要实时捕获遮罩,或者设备/系统版本不满足捕获要求,可以用iOS 16.0及以上的CISegmentSky滤镜直接生成天空遮罩:

if #available(iOS 16.0, *) {
    let inputImage = CIImage(contentsOf: imageURL)!
    let skySegmentFilter = CIFilter(name: "CISegmentSky")!
    skySegmentFilter.setValue(inputImage, forKey: kCIInputImageKey)
    
    // 提取天空遮罩(输出图像的alpha通道即为遮罩)
    let skyMatte = skySegmentFilter.outputImage?.applyingFilter("CIMaskToAlpha")
}

这个滤镜会直接分析图片内容生成天空区域的遮罩,无需依赖拍摄时的额外设置,适配场景更灵活。

内容的提问来源于stack exchange,提问作者Damien Jardon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:25:03