Metal每日分享,基于色温调整白平衡滤镜效果

news2025/2/5 17:50:08

本案例的目的是理解如何用Metal实现基于色温调整白平衡效果滤镜,主要就是消除或减轻日光下偏蓝和白炽灯下偏黄,简单讲把应该是白色的调成白色或接近白色,不使其严重偏色;


Demo

  • HarbethDemo地址
  • iDay每日分享文档地址

实操代码

// 白平衡滤镜
let filter = C7WhiteBalance.init(temperature: 4000, tint: -200)

// 方案1:
ImageView.image = try? BoxxIO(element: originImage, filters: [filter, filter2, filter3]).output()

// 方案2:
ImageView.image = originImage.filtering(filter, filter2, filter3)

// 方案3:
ImageView.image = originImage ->> filter ->> filter2 ->> filter3

效果对比图

  • 不同参数下效果
temperature: 4000, tint: -200temperature: 4000, tint: 0temperature: 4000, tint: 200
WX20221220-092550.pngWX20221220-092642.pngWX20221220-092602.png
temperature: 7000, tint: -200temperature: 7000, tint: 0temperature: 7000, tint: 100
WX20221220-092657.pngWX20221220-092708.pngWX20221220-092726.png

实现原理

  • 过滤器

这款滤镜采用并行计算编码器设计.compute(kernel: "C7WhiteBalance"),参数因子[temperature, tint]

对外开放参数

  • temperature: 调整图像的温度,4000的值非常凉爽,7000非常温暖;
  • tint: 调整图像的色调,-200的值是非常绿色的,200是非常粉红色的;
/// 白平衡
public struct C7WhiteBalance: C7FilterProtocol {
    
    public static let range: ParameterRange<Float, Self> = .init(min: 4000, max: 7000, value: 5000)
    
    /// The tint to adjust the image by. A value of -200 is very green and 200 is very pink.
    public var tint: Float = 0
    /// The temperature to adjust the image by, in ºK. A value of 4000 is very cool and 7000 very warm.
    /// Note that the scale between 4000 and 5000 is nearly as visually significant as that between 5000 and 7000.
    public var temperature: Float = range.value
    
    public var modifier: Modifier {
        return .compute(kernel: "C7WhiteBalance")
    }
    
    public var factors: [Float] {
        return [temperature, tint]
    }
    
    public init(temperature: Float = range.value, tint: Float = 0) {
        self.temperature = temperature
        self.tint = tint
    }
}
  • 着色器

将图像从RGB空间转换到YIQ空间的rgb值,控制蓝色值处于(-0.5226…0.5226)区间之间,再将YIQ空间颜色转换为RGB空间颜色rgb,对比暖色常量warm获取到新的rgb,最后混色原色和新的rgb和图像色温得到最终的像素rgb;

kernel void C7WhiteBalance(texture2d<half, access::write> outputTexture [[texture(0)]],
                           texture2d<half, access::read> inputTexture [[texture(1)]],
                           constant float *temperature_ [[buffer(0)]],
                           constant float *tint [[buffer(1)]],
                           uint2 grid [[thread_position_in_grid]]) {
    const half4 inColor = inputTexture.read(grid);
    
    const half3x3 RGBtoYIQ = half3x3({0.299, 0.587, 0.114}, {0.596, -0.274, -0.322}, {0.212, -0.523, 0.311});
    const half3x3 YIQtoRGB = half3x3({1.000, 0.956, 0.621}, {1.000, -0.272, -0.647}, {1.000, -1.105, 1.702});
    
    half3 yiq = RGBtoYIQ * inColor.rgb;
    yiq.b = clamp(yiq.b + half(*tint/100) * 0.5226 * 0.1, -0.5226, 0.5226);
    const half3 rgb = YIQtoRGB * yiq;
    
    const half3 warm = half3(0.93, 0.54, 0.0);
    const half r = rgb.r < 0.5 ? (2.0 * rgb.r * warm.r) : (1.0 - 2.0 * (1.0 - rgb.r) * (1.0 - warm.r));
    const half g = rgb.g < 0.5 ? (2.0 * rgb.g * warm.g) : (1.0 - 2.0 * (1.0 - rgb.g) * (1.0 - warm.g));
    const half b = rgb.b < 0.5 ? (2.0 * rgb.b * warm.b) : (1.0 - 2.0 * (1.0 - rgb.b) * (1.0 - warm.b));
    
    half temperature = half(*temperature_);
    temperature = temperature < 5000 ? 0.0004 * (temperature - 5000) : 0.00006 * (temperature - 5000);
    const half4 outColor = half4(mix(rgb, half3(r, g, b), temperature), inColor.a);
    outputTexture.write(outColor, grid);
}

色温曲线

  • 相同的物体在不同的色温光源下呈现出相同的颜色,这就称为色彩恒常性;
  • 白平衡的目的就是使得图像传感器在不同色温光源下拍摄的物体进行一个图像纠正的过程,还原物体本来的颜色。
  • 也可以说是在任意色温条件下,图像传感器所拍摄的标准白色经过白平衡的调整,使之成像后仍然为白色。

先看看在不同光源下呈现出来的颜色如下图:

流程原理:

  • 在各个色温下(2500~7500)拍几张白纸照片,假设拍6张(2500,3500…7500),可以称作色温照;
  • 把色温照进行矫正,具体是对R/G/B通道进行轿正,让偏色的白纸照变成白色,并记录各个通道的矫正参数;
  • 判断图像的色温,是在白天,晚上,室内,室外,是烈日还是夕阳,还是在阳光下的沙滩上,或者是在卧室里”暖味”的床头灯下;

Harbeth功能清单

  • 支持ios系统和macOS系统
  • 支持运算符函数式操作
  • 支持多种模式数据源 UIImage, CIImage, CGImage, CMSampleBuffer, CVPixelBuffer.
  • 支持快速设计滤镜
  • 支持合并多种滤镜效果
  • 支持输出源的快速扩展
  • 支持相机采集特效
  • 支持视频添加滤镜特效
  • 支持矩阵卷积
  • 支持使用系统 MetalPerformanceShaders.
  • 支持兼容 CoreImage.
  • 滤镜部分大致分为以下几个模块:
    • Blend:图像融合技术
    • Blur:模糊效果
    • Pixel:图像的基本像素颜色处理
    • Effect:效果处理
    • Lookup:查找表过滤器
    • Matrix: 矩阵卷积滤波器
    • Shape:图像形状大小相关
    • Visual: 视觉动态特效
    • MPS: 系统 MetalPerformanceShaders.

最后

  • 慢慢再补充其他相关滤镜,喜欢就给我点个星🌟吧。
  • 滤镜Demo地址,目前包含100+种滤镜,同时也支持CoreImage混合使用。
  • 再附上一个开发加速库KJCategoriesDemo地址
  • 再附上一个网络基础库RxNetworksDemo地址
  • 喜欢的老板们可以点个星🌟,谢谢各位老板!!!

✌️.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何多人配音?告诉你这几个实用的配音技巧

大家平常在刷短视频时&#xff0c;有没有刷到过一些搞笑配音视频呢&#xff1f;有些视频是由多人互动或者一人扮演多角而成的&#xff0c;这些创作者把当下比较热门的话题通过配音的方式呈现出来&#xff0c;或让我们捧腹大笑、或让我们引起思考。如果你也想通过这种方式来制作…

JVS低代码基础介绍

企业信息化底座 JVS是面向软件开发团队可以快速实现应用的基础开发脚手架&#xff0c;主要定位于企业信息化通用底座&#xff0c;采用微服务分布式框架&#xff0c;提供丰富的基础功能&#xff0c;集成众多业务引擎&#xff0c;它灵活性强&#xff0c;界面化配置对开发者友好&a…

Git仓库创建、代码更新、代码提交完整版(Gitee、Github、GitLab对比)

区别 Gitee、Github、GitLab三个都提供了 个人和团队存储、分享、发布和协同开发项目的中心化云存储功能 名称代码版块控制管理工具是否收费搭建环境联网/github git 公有仓库免费 私有仓库收费&#xff08;鼓励代码共享&#xff09; 企业私有需要搭建可离线&#xff08;分布…

在英特尔独立显卡上部署YOLOv5 v7.0版实时实例分割模型

作者&#xff1a;贾志刚 英特尔物联网创新大使  目录 1.1 YOLOv5实时实例分割模型简介 1.2 英特尔消费级锐炫™ A 系列显卡简介 1.3 在英特尔独立显卡上部署YOLOv5-seg模型的完整流程 1.3.1 搭建YOLOv5开发环境和OpenVINO部署环境 1.3.2 验证YOLOv5开发环境和OpenVINO部…

Spring Cloud之acos服务注册与Dubbo

Spring Cloud之acos服务注册与Dubbo nacos是springcloud的扩展&#xff0c;注册中心功能通过NacosDiscoveryClient 继承DiscoveryClient&#xff0c;在springcloud中&#xff0c;与Eureka可以无侵入的切换。注册中心可以手动剔除服务实例&#xff0c;通过消息通知客户端更新缓…

【推荐】数据湖技术及实践与案例资料汇总合集47篇

数据湖或hub的概念最初是由大数据厂商提出的&#xff0c;表面上看&#xff0c;数据都是承载在基于可向外扩展的HDFS廉价存储硬件之上的。但数据量越大&#xff0c;越需要各种不同种类的存储。最终&#xff0c;所有的企业数据都可以被认为是大数据&#xff0c;但并不是所有的企业…

30多条立马执行的站内SEO优化建议

站内SEO优化,讲来讲去很多年,但是国内很少有比较全面的Check List。国外的文章,一般都是教你如何优化一篇文章。而不是教你如何打造一个一个商业化的产品页。本篇文章是结合我这几年的独立站SEO项目经验,对站内SEO进行的一些总结,有30多条立马执行的站内SEO优化建议。 其实…

SpringBoot+Actuator+Prometheus+Grafana进行可视化应用监控

最终效果 actuator actuator是什么 看一看chatGPT怎么说&#xff1f; Spring Boot Actuator是Spring Boot的一个子项目&#xff0c;它为监视和管理Spring Boot应用程序提供了附加功能。它提供了一组端点&#xff0c;允许您监视和管理应用程序&#xff0c;如运行状况检查、度量…

[附源码]计算机毕业设计Python电影推荐网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

使用FastDeploy在英特尔CPU和独立显卡上端到端高效部署AI模型

目录 1.1 产业实践中部署AI模型的痛点 1.1.1 部署模型的典型流程 1.1.2 端到端的AI性能 1.1.3 部署模型的难点和痛点 1.2 FastDeploy简介 1.3 英特尔独立显卡简介 1.4 使用FastDeploy在英特尔CPU和独立显卡上部署模型的步骤 1.4.1 搭建FastDeploy开发环境 1.4.2 下载…

秒杀/抢购架构设计

1 秒杀业务分析 1.1 正常电子商务流程 &#xff08;1&#xff09;查询商品&#xff1b; &#xff08;2&#xff09;创建订单&#xff1b; &#xff08;3&#xff09;扣减库存&#xff1b; &#xff08;4&#xff09;更新订单&#xff1b; &#xff08;5&#xff09;付款&…

Odoo丨手把手教你灵活控制表单明细的创建与删除!

文章目录一、前言二、表单明细的创建与删除1.根据主表字段带出明细信息2.根据主表字段控制明细表的添加和删除功能三、总结一、前言 我们知道&#xff0c;在Odoo页面上&#xff0c;控制的最小单位是字段&#xff0c;可通过Odoo提供的属性&#xff0c;控制字段的必填、只读、隐…

Spring Cloud 应用 Proxyless Mesh 模式探索与实践

作者&#xff1a;十眠 Service Mesh 简介 Service Mesh 早已不是一个新兴的概念&#xff0c;目前已经有许多关于 Service Mesh 的探索以及实践。 2016 年可以说是 Service Mesh 的元年&#xff0c;Buoyant 公司 CEO William Morgan 率先发布 Linkerd &#xff0c;成为业界首…

Java中的多线程(上)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 多线程 什么是线程 为什么需要多线程 进程和线程的区别&#xff08;面试重点&#xff09; Java实现多线程 多线程带来的好处 认识Thread类 T…

前端基础_贝塞尔和二次方曲线

贝塞尔和二次方曲线 贝塞尔曲线可以是二次和三次方的形式&#xff0c;常用于绘制复杂而有规律的形状。 绘制贝塞尔曲线主要使用bezierCurveTo方法。该方法可以说是lineTo的曲线版&#xff0c;将从当前坐标点到指定坐标点中间的贝塞尔曲线追加到路径中。该方法的定义如下。 b…

艾美捷耗氧率检测试剂盒说明书及相关研究

细胞内稳态通过ATP的产生来维持。ATP的生成可以通过单独的糖酵解&#xff08;无氧呼吸&#xff09;或通过糖酵解与氧化磷酸化的耦合来完成。氧化磷酸化是氧&#xff08;O2&#xff09;依赖性的&#xff0c;发生在线粒体中&#xff0c;是哺乳动物细胞合成ATP的最有效和优选的方法…

电力系统可视化——比PowerWorld还精彩(Matlab实现)

目录 1 概述 2 PowerWorld 3 案例及Matlab代码实现 3.1 案例 3. 2 结果展现 3.3 Matlab代码实现 1 概述 信息可视化的应用为电力行业带来了巨大的希望&#xff0c;但其潜力尚未被可视化社区充分挖掘。先前关于电力系统可视化的工作仅限于在地理布局之上描绘原始或处理过的…

【数据结构】单链表OJ

目录 一、反转单链表 描述 二、返回链表的中间节点 三、返回倒数第K个节点 描述 示例1 四、合并两个已排序的链表 描述 五、分隔链表 六、判断一个链表是否为回文结构 描述 示例1 示例2 示例3 七、两个链表的第一个公共结点 描述 输入描述&#xff1a; 返回值描…

LICEcap:GIF屏幕录制工具

写博客的时候&#xff0c;我经常会用到需要自制gif的场景&#xff0c;我之前一直使用视频转gif工具处理https://tool.lu/video2gif/&#xff0c;大致就是利用qq录屏成视频&#xff0c;然后通过工具转成gif。 今天无意间看到其他博主用了 LICEcap 工具 LICEcap 是一款简洁易用的…

“隐形贫困者”自学Python做副业,教你如何月入10000+

现在的年轻人总是觉得攒不下钱&#xff0c;虽然表面风光&#xff0c;每天出入高级CBD&#xff0c;可是几乎每个人都是月光族&#xff0c;这一类人被定义为“隐形贫困者”&#xff0c;原因是什么呢&#xff1f;根据小编的分析&#xff0c;现在人们对生活质量要求普遍提高了&…