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

简介: 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: -200 temperature: 4000, tint: 0 temperature: 4000, tint: 200

1.png

1.png

1.png

temperature: 7000, tint: -200 temperature: 7000, tint: 0 temperature: 7000, tint: 100

1.png

1.png

1.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);
}


色温曲线


相同的物体在不同的色温光源下呈现出相同的颜色,这就称为色彩恒常性;

白平衡的目的就是使得图像传感器在不同色温光源下拍摄的物体进行一个图像纠正的过程,还原物体本来的颜色。

也可以说是在任意色温条件下,图像传感器所拍摄的标准白色经过白平衡的调整,使之成像后仍然为白色。

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

1.png

流程原理:

在各个色温下(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地址

喜欢的老板们可以点个星🌟,谢谢各位老板!!!✌️.

相关文章
|
算法 API 计算机视觉
OpenCV和Halcon分别实现彩色图像的白平衡效果
OpenCV和Halcon分别实现彩色图像的白平衡效果
1154 0
|
关系型数据库 MySQL Java
Mac环境下SonarQube的安装与使用
SonarQube是一个用于代码质量管理的开源平台,可以快速的定位代码中潜在的或者明显的错误,支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言.
3405 0
|
9月前
|
机器学习/深度学习 算法 C++
R语言贝叶斯MCMC:GLM逻辑回归、Rstan线性回归、Metropolis Hastings与Gibbs采样算法实例
R语言贝叶斯MCMC:GLM逻辑回归、Rstan线性回归、Metropolis Hastings与Gibbs采样算法实例
|
存储 大数据 API
swift 中 Realm 使用详解
当涉及到在 Swift 项目中进行本地数据库存储时,Realm 是一个强大且易用的解决方案。它提供了高性能、跨平台的数据库引擎,能够轻松地处理数据持久化和查询操作。本篇博客将介绍 Realm 的基本使用方法,以及一些需要注意的事项,从而能更好地利用 Realm 来管理本地数据。
pr2023安装包免费下载Premiere2023永久版安装包
包括Premiere Pro 2019、2020、2021、2022、2023等版本及其所有历史版本。目前功能最强大的视频编辑软件,是Adobe Premiere Pro,简称Pr。该软件不仅广泛应用于电影、电视节目的视频编辑制作,也是小视频等自媒体创作者剪辑制作视频、音频必不可少的工具。
3681 0
|
算法 API iOS开发
iOS MachineLearning 系列(3)—— 静态图像分析之区域识别
本系列的前一篇文章介绍了如何使用iOS中自带的API对图片中的矩形区域进行分析。在图像静态分析方面,矩形区域分析是非常基础的部分。API还提供了更多面向应用的分析能力,如文本区域分析,条形码二维码的分析,人脸区域分析,人体分析等。本篇文章主要介绍这些分析API的应用。
308 0
|
前端开发 JavaScript 程序员
5 个网站将您的前端技能提升100倍
5 个网站将您的前端技能提升100倍
235 0
|
JSON atlas 图形学
unity之spine骨骼动画使用
unity实现spine骨骼动画使用
unity之spine骨骼动画使用
|
9月前
|
Java Python
如何设置代理ip服务器地址
如何设置代理ip服务器地址
165 0

热门文章

最新文章