Metal每日分享,自然饱和度滤镜效果

news2025/2/4 1:13:26

本案例的目的是理解如何用Metal实现自然饱和度效果滤镜,简单讲就是调整图像整体的明亮程度,如调节到较高数值,图像会产生色彩过饱和从而引起图像失真;


Demo

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

实操代码

// 自然饱和度滤镜
let filter = C7Vibrance.init(vibrance: -1.2)

// 方案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

效果对比图

  • 不同参数下效果
vibrance: -1.2vibrance: -0.5vibrance: 1.0
WX20221220-090820.pngWX20221220-090653.pngWX20221220-090709.png

实现原理

  • 过滤器

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

对外开放参数

  • vibrance: 将图像的振动从-1.2更改为1.2,默认值为0.0;
/// 自然饱和度
public struct C7Vibrance: C7FilterProtocol {
    
    public static let range: ParameterRange<Float, Self> = .init(min: -1.2, max: 1.2, value: 0.0)
    
    /// Change the vibrance of an image, from -1.2 to 1.2, with a default of 0.0
    public var vibrance: Float = range.value
    
    public var modifier: Modifier {
        return .compute(kernel: "C7Vibrance")
    }
    
    public var factors: [Float] {
        return [vibrance]
    }
    
    public init(vibrance: Float = range.value) {
        self.vibrance = vibrance
    }
}
  • 着色器

计算出rgb的平均值,获取单通道颜色的最大值,得到饱和度计算后值amt,混合rgb和最大值和饱和度值得到最终的像素rgb;

kernel void C7Vibrance(texture2d<half, access::write> outputTexture [[texture(0)]],
                       texture2d<half, access::read> inputTexture [[texture(1)]],
                       constant float *vibrance [[buffer(0)]],
                       uint2 grid [[thread_position_in_grid]]) {
    const half4 inColor = inputTexture.read(grid);
    
    const half average = (inColor.r + inColor.g + inColor.b) / 3.0h;
    const half mx = max(inColor.r, max(inColor.g, inColor.b));
    const half amt = (mx - average) * (-half(*vibrance) * 3.0h);
    const half4 outColor = half4(mix(inColor.rgb, half3(mx), amt), inColor.a);
    
    outputTexture.write(outColor, grid);
}

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/103598.html

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

相关文章

攻防世界get_post

攻防世界get_post 题目描述&#xff1a;X老师告诉小宁同学HTTP通常使用两种请求方法&#xff0c;你知道是哪两种吗&#xff1f; 查看界面&#xff0c;要求用GET方式提交一个名为a,值为1的变量。 打开burp suite。 设置浏览器本地代理。 抓包。 发送到重发器。 用GET方式提交一个…

点击化学试剂一种环炔烃DBCO-PEG-N3及同系列产品

中文名称&#xff1a;氮杂二苯并环辛炔-聚乙二醇-叠氮 英文名称&#xff1a;DBCO-PEG-N3 英文别名&#xff1a; Dibenzocycolctyne-PEG-Azide 产品纯度&#xff1a; ≥95% 产品用途&#xff1a; 应用于医学研究&#xff0c;药物释放&#xff0c;纳米技术和新材料研究&am…

代码复现之:RCNN(1)分类任务构建 + 模型训练

文章目录资源链接复现开始环境安装创建 conda 虚拟环境&#xff0c;python 3.6 版本安装程序运行环境1. mkdoc 相关的环境2. 程序运行需要的环境流程参考数据集创建分类任务1. 加载原数据集 VOC20072. 将所有类数据单独提取3. 对于每个 class 的数据&#xff0c;构造正负例样本…

AVL树详解

1.AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。 因此&#xff0c;两位俄罗斯的数学家发明了一种解决上述问题的方法&#xff1a; 当向二叉…

内网穿透软件对比——cpolar : 花生壳(下)

系列文章 内网穿透软件对比——cpolar : 花生壳&#xff08;上&#xff09;内网穿透软件对比——cpolar : 花生壳&#xff08;中&#xff09;内网穿透软件对比——cpolar : 花生壳&#xff08;下&#xff09; 文章目录系列文章1. 前言2. 对比内容2.1.TCP协议功能及操作对比2.1…

【JavaEE】多线程(二)Thread 类及常见方法

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:Thread类再剖析&#xff01; &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE初阶代码存放&#xff01; ⛵⛵作者简…

对记录做横向分栏

【问题】 Hi i have a single list of employees. Each employee will have his name and salary. i have given the list of employees to a table but it appears as follows Employee Name Salary harish 3000 kiran 4000 Emili 6000 h…

Jenkins(2)— 配置webhook触发器

1、webhook介绍 Gitee WebHook触发器 的功能是帮助用户 push 代码后&#xff0c;自动回调一个您设定的 http 地址。例如我们可以通过添加webhook触发器来实现这样一个功能&#xff1a; 每当开发push代码到提测分支后&#xff0c;自动触发jenkins构建&#xff0c;运行自动化测…

闲暇之际敲敲代码,记录Leetcode刷题03

文章目录前言一、删除链表中的节点1.1 问题描述1.2 思路分析二、反转链表2.1 问题描述2.2 思路分析前言 利用闲暇之际敲敲代码&#xff0c;提升编程技能及提高算法能力。 一、删除链表中的节点 1.1 问题描述 有一个单链表的 head&#xff0c;我们想删除它其中的一个节点 no…

Tensorflow基础入门超全总结

1.1 TensorFlow介绍 深度学习框架TensorFlow一经发布&#xff0c;就受到了广泛的关注&#xff0c;并在计算机视觉、音频处理、推荐系统和自然语言处理等场景下都被大面积推广使用&#xff0c;现在已发布2.3.0版本&#xff0c;接下来我们深入浅出的介绍Tensorflow的相关应用。 …

记录一个阿里云Android端文件上传的BUG

背景 Android移动端需要接入阿里云视频点播模块下的一个客户端上传的SDK。需要将移动端本地文件上传至阿里云服务器。 问题描述 调用方法及业务逻辑不赘述&#xff0c;贴张官方图&#xff0c;选择了上传地址和凭证的方法进行上传&#xff0c;并且是后台集成点播服务端SDK并调用…

关于哈希表

package com.javase.map.hashmap;import java.util.HashMap; import java.util.Map; import java.util.Set;/*** 关于HashMap&#xff1a;* 1.HashMap集合的底层是哈希表/散列表的数据结构。* 2.哈希表是数组和单向链表的结合体&#xff0c;充分发挥了它们各自的优点。…

【机器学习】三种主要集成学习思想简介

集成学习 集成学习通过训练多个分类器,然后将其组合起来,从而达到更好的预测性能,提高分类器的泛化能力。 目前集成学习有3个主要框架:bagging、boosting、stacking。 bagging套袋法 bagging是并行集成学习方法的最著名代表,其算法过程如下: 从原始样本集中抽取训练…

【云原生进阶之容器】第一章Docker核心技术1.8节——DockerFile解析

1 Dockfile详解 1.1 什么是Dockerfile 首先通过一张图来了解 Docker 镜像、容器和 Dockerfile 三者之间的关系。 通过上图可以看出使用 Dockerfile 定义镜像,运行镜像启动容器。 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文…

技术分享 | 黑盒测试方法论—场景法

场景法就是模拟用户操作软件时的场景&#xff0c;主要用于测试系统的业务流程。 测试不能只关注某个控件的边界值、等价类是否满足要求&#xff0c;也要关注它的主要功能和业务流程是否正确实现&#xff0c;这时就需要使用场景法来完成。 场景法 用例场景是用来描述流经用例路…

OpenHarmony 物联网设备开发环境搭建

前言 我们介绍的是华为官方推荐的 Windows + Ubuntu 混合开发的环境,使用Windows平台的DevEco Device Tool 进行可视化界面进行相关操作,通过远程连接的方式对接Ubuntu下的DevEco Device Tool,然后对Ubuntu下的源码进行开发、编译、烧录等操作。 目前官方不支持Mac系统,所…

【docker】什么是容器数据卷?

docker的理念回顾 将应用和环境打包成一个镜像&#xff01; 数据&#xff1f;如果数据都在容器中&#xff0c;那么我们容器删除&#xff0c;数据就会丢失&#xff01;需求&#xff1a;数据可以持久化 MySQL&#xff0c;容器删了&#xff0c;删库跑路&#xff01;需求&#x…

测试工具平台 MeterSphere 分享

一、官网地址 meterSphere 二、安装方式 Linux安装 默认账号密码&#xff1a; URL: http://$LOCAL_IP:8081用户名: admin初始密码: metersphere三、nginx配置 直接上配置 location / {proxy_pass http://localhost:8081;client_max_body_size 1000m;#access_log off;# 配…

SPDK代码结构浅析

最近这三周时间一直因为工作的需要在研究SPDK移植到RISCV平台上&#xff0c;在编译通过的时候&#xff0c;也顺带把SPDK的代码粗粗过了一遍&#xff0c;顺便做了一点笔记。 SPDK (Storage Performance Development Kit)其实就是在用户空间&#xff0c;采用轮询的方式无锁的NVM…

通达信下单接口获取指数成份股的步骤分享

通达信下单接口获取指数成份股的步骤分享&#xff1a; ContextInfo.get_sector() 接口&#xff1a;https://gitee.com/metatradeapi 用法&#xff1a; ContextInfo.get_sector(sector, realtime) 释义&#xff1a; 获取板块成份股&#xff0c;只支持取指数成份股 参数&…