GPUImage源码解读(二十四)

FFmpegAndroid,android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编解码、转 Gif 动图;音视频合成与分离;音视频解码、同步与播放;FFmpeg 本地推流、H264 与 RTMP 实时推流直播;OpenGL GPUImage ffmpeg:色调、亮度、亮度、亮度.zip 立即下载
GPUImageLookupFilter

GPUImageLookupFilter 是GPUImage中的颜色查找滤镜,在一般的相机应用中使用得最广泛,它的作用是通过颜色变换从而产生出新风格的图片,在philm项目中也有大量使用

LUT (Lookup Tables)即查找表 。LUT是个非常简单的数值转换表,不同的色彩输入数值“映射”到一套输出数值,用来改变图像的色彩。例如:红色在LUT中可能被映射成蓝色,于是,应用LUT的图像中每个红的地方将由蓝色取代。不过,LUT的实际应用要比这种情况更微妙一些。LUT通常用来矫正域外色的问题。例如,一个以RGB色彩空间存储的图像要打印到纸上时,必须首先将文件转换为CMYK色彩空间。这可以用一个LUT将每个RGB色彩转换为等效的CMYK色彩,或者与域外色最接近的色彩(LUT还能够用缩放的方法在一定程度改变所有的色彩,因此可使图像在视觉上与原来相同)。 另外需要注意的一个问题是,尽管查找表经常效率很高,但是如果所替换的计算相当简单的话就会得不偿失,这不仅仅因为从内存中提取结果需要更多的时间,而且因为它增大了所需的内存并且破坏了高速缓存。如果查找表太大,那么几乎每次访问查找表都会导致高速缓存缺失,这在处理器速度超过内存速度的时候愈发成为一个问题.LUT查找表图可以使用 PS 生成.

在GPUImage中使用的是二维的LUT图片,它是一张512x512大小的图片。它由8x8个大正方形格子组成,每个大格子又是由64x64个小正方形组成。因此,LUT图片的宽度:8*64=512,高度:8*64=512。对于每个小正方形,它的宽度值即为R通道值,高度即为G通道值。由于R通道的范围为0~255,因此,从宽度方面来看,每个小正方形的R通道的差为:256/64=4,R通道的集合为[0,4,8,12,16,…,255],同理从高度上看,每个小正方形的G通道的差为:256/64=4,G通道的集合为[0,4,8,12,16,…,255],由于RG通道值存放在每个64x64的大正方形中,那么B通道的值存放在哪里呢?答案就是在8x8=64个大正方形中,不难看出每个RGB通道都是用64个点来存放,占用空间为:64x64x64=262144。不同于RG通道的是,B通道存放时使用了宽度和高度分别为8个大正方形。
这里写图片描述
LUT 排列图如下
这里写图片描述

LUT生成代码

“`
Additional Info:
Lookup texture is organised as 8x8 quads of 64x64 pixels representing all possible RGB colors:
for (int by = 0; by < 8; by++) {
for (int bx = 0; bx < 8; bx++) {
for (int g = 0; g < 64; g++) {
for (int r = 0; r < 64; r++) {
image.setPixel(r + bx * 64, g + by * 64, qRgb((int)(r * 255.0 / 63.0 + 0.5),
(int)(g * 255.0 / 63.0 + 0.5),
(int)((bx + by * 8.0) * 255.0 / 63.0 + 0.5)));
}
}
}
}

“`

GPUImageLookupFilter 就是根据LUT获取相应的变换颜色,我们可以使用PS直接改变lookup颜色表,从而改变图片的风格。常用的PS工具有「曲线」,「饱和度」、「色彩平衡」、「可选颜色」,但是GPUImageLookupFilter的局限在于只能进行颜色上的调整(曲线,色彩平衡等),其它效果调整也只限于利用图层间混合模式的更改,例如做暗角、漏光等效果。GPUImageLookupFilter继承自GPUImageTwoInputFilter,接受LUT纹理和待滤镜的图片输入. GPUImageAmatorkaFilter, GPUImageMissEtikateFilter, and GPUImageSoftEleganceFilter它们的原理都是使用Color Lookup Tables,只是使用的纹理不同而已。
源码中主要有两着色器

  • 两路输入的顶点着色器,在父类中

    “`

    NSString *const kGPUImageTwoInputTextureVertexShaderString = SHADER_STRING
    (
    attribute vec4 position;
    attribute vec4 inputTextureCoordinate;
    attribute vec4 inputTextureCoordinate2;

    varying vec2 textureCoordinate;
    varying vec2 textureCoordinate2;

    void main()
    {
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
    textureCoordinate2 = inputTextureCoordinate2.xy;
    }
    );



- 片元着色器 区分MAC & iphone环境

NSString *const kGPUImageLookupFragmentShaderString = SHADER_STRING
(
varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2; // TODO: This is not used

uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2; // lookup texture

void main()
{
highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);

 highp float blueColor = textureColor.b * 63.0;

 // 根据B通道获取小正方形格子(64x64格子)
 highp vec2 quad1;
 quad1.y = floor(floor(blueColor) / 8.0);
 quad1.x = floor(blueColor) - (quad1.y * 8.0);

 highp vec2 quad2;
 quad2.y = floor(ceil(blueColor) / 8.0);
 quad2.x = ceil(blueColor) - (quad2.y * 8.0);

 // 根据小正方形格子和RG通道,获取纹理坐标,每个大格子的大小:1/8=0.125,每个小格子的大小:1/512
 highp vec2 texPos1;
 texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
 texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

 highp vec2 texPos2;
 texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
 texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

 lowp vec4 newColor1 = texture2D(inputImageTexture2, texPos1);
 lowp vec4 newColor2 = texture2D(inputImageTexture2, texPos2);

 lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor));
 gl_FragColor = vec4(newColor.rgb, textureColor.w);

}
);

“`

【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门) PacketTracer软件内MCU芯片编程入门 零基础 阅读详情

相关推荐

不用买显示器!用USBMMID虚拟显示器软件在Win10上扩展4个屏幕(保姆级教程)

本文提供了一份详细的保姆级教程,指导用户如何在Windows 10系统上,无需购买额外硬件,通过USBMMID虚拟显示器软件扩展出多达4个虚拟屏幕。文章深入解析了虚拟显示器的核心原理,并基于微软IDD框架,手把手教学从软件获取、环境检查到安装配置的全过程,帮助开发者和多任务用户构建高效、免费的虚拟多屏工作站,实现生产力的飞跃。

backprop5master的博客 659

GPUImage详细解析(二)

http://www.jianshu.com/p/1eea8bf8451e 解析 GPUImage详细解析(一) 上一篇介绍的是GPUImageFramebuffer和GPUImageFilter。 简单回顾一下: GPUImageFilter就是用来接收源图像,通过自定义的顶点、片元着色器来渲染新的图像,并在绘制完成后通知响应链的下一个对象。GPUImageFr

xiaota00的博客 1350

芯片设计数字后仿与SDF文件:原理、流程与实战调试指南

在数字芯片设计流程中,时序验证是确保芯片功能正确与性能达标的核心环节。其原理在于通过精确的物理延迟模型,模拟信号在真实硅片上的传播行为,从而暴露理想仿真中无法发现的时序问题。这项技术的核心价值在于它是连接前端逻辑设计与后端物理实现的桥梁,能有效发现建立时间/保持时间违例、时钟偏斜、竞争冒险等关键风险,是保障芯片一次流片成功的关键步骤。其典型应用场景包括高性能计算单元、复杂SoC以及低功耗设计中的状态切换验证。本文聚焦于数字后仿真的具体实施,深入解析SDF文件的结构与反标机制,并提供从环境搭建、波形分析到与静

weixin_34279184的博客 382

图像处理之LUT

OpenGL lut

翻肚鱼儿的博客 3320

计量经济学tempdisagg的python库:年度时序变月度

计量经济学tempdisagg的python库:年度时序变月度

素质云笔记 1528

Origin作图——等高线图

最近做一个测试数据图,开始想通过用热图来展示,结果发现热图有很多的小方块,很难呈现出最好的效果,因为数据是有一层一层的递进效果,因此经过尝试后,发现等高线图是个好选择。 热图展示效果如下:其中有很多的小方块不适合,热图制图方法前面有记录。 下面展示等高线图制作方法。首先是导入数据,可以从excal导入,也可以直接复制进去。等方法。 选中要展示的数据,绘图----等高线图 选中箭头,确定。 双击图像,点击线,我们需要把线隐藏了. 双击图像,我们需要调色板,根据自己的选择,一般用调色板的颜色。

qq_42278015的博客 1万+

GPUImage源码分析(五):GPUImageLookupFilter

GPUImage源码分析(五):GPUImageLookupFilter 22019.01.06 16:35:54字数 539阅读 400 图像查表法原理,网上有很多资料有介绍,本文主要参考了https://blog.youkuaiyun.com/danffer1985/article/details/78692992 这篇博客,本文仅做自己的知识梳理和记录。如博主有意见可留言。 lookup查表法,简而言之就是,根据原图的像素的RGB值,找到颜色表上的对应位置,然后用颜色表上的RGB值替换原图上的像素的RGB值

翻肚鱼儿的博客 951

WPF毛玻璃效果别再写C#代码了!纯XAML用Border+VisualBrush+BlurEffect三步搞定

本文详细介绍了如何在WPF中通过纯XAML实现毛玻璃效果,无需编写C#代码。通过VisualBrush、BlurEffect和Clip的黄金组合,开发者可以快速创建专业级的毛玻璃面板,提升UI的现代感和视觉层次。文章还提供了性能优化技巧和实战案例,帮助开发者在各种场景中高效应用这一技术。

weixin_28630185的博客 352

android 代码 lut,Android基于Shader的图像处理(7)-颜色表LUT

颜色表LUT(LookUp Table)主要用于滤镜,详细原理讲解参考这里《iOS 针对 LUT 滤镜的实现对比》。这里说下应用和注意的地方。fairy_tale.png颜色表LUT在这里用上面的图片,加载后当做lut纹理使用,用原本的RGB值去查找这个lut纹理得到最终的RGB值,所以这里有两个纹理,一个是originTexture表示本来图片,一个是lutTexture表示lut纹理。LUTA...

weixin_28951585的博客 498

在线考试题库抓取:Python 爬虫抓取各类在线考试平台题库和试题

通过这些技术,您可以抓取各类在线考试平台上的题库数据,进行数据分析、生成练习题集,甚至用于考试准备。为了演示抓取过程,本篇博客选择了两个常见的在线考试平台进行数据抓取:一个是教育考试平台(如“中小学题库”),另一个是职业考试平台(如“华图教育”)。对于这些网站,我们需要找到包含题库信息的页面,并分析每一页的 HTML 结构,从而定位到题目、选项、答案等数据。大多数在线考试平台的题库是分页显示的,因此我们需要遍历多个页面,抓取所有的题库数据。因此,我们需要设置合适的请求头来模拟真实的浏览器请求。

2201_76125261的博客 3438

45、数据挖掘学术文献推荐

本文是一篇关于数据挖掘领域的重要学术文献推荐,涵盖了经典理论与最新研究成果。内容包括关键研究论文、综述文章、教科书和专著的介绍,以及来自顶级会议和期刊的出版物推荐。此外,还探讨了数据挖掘与其他领域的交叉研究,如机器学习、统计学和数据库系统,并列举了多个实际应用案例。最后,分析了数据挖掘的未来发展趋势,如更加智能化的算法、高效的计算平台及隐私保护技术。无论是初学者还是专业人士,这些文献都将提供宝贵的学习资源和前沿动态。

qsc90123456的博客 228

Android GPUImage源码分析(四) Lookup滤镜的使用

Android GPUImage源码分析(四) Lookup滤镜的使用 一、lookup滤镜输入双纹理输入滤镜 /**** * 双纹理输入滤镜 */ public class GPUImageTwoInputFilter extends GPUImageFilter { /**顶点坐标shader**/ private static final String VERTE...

1009

AI快速变现之路,AI视频创作

初期投入$3000(工具订阅+样片制作),重点攻克跨境电商和本地生活服务市场。关注2025年AIGC视频工具的API降价趋势(如Pika企业版折扣可达50%),建议与云服务商签订长期合作协议。

qq_29896351的博客 1981

GPUImage 源码分析

GPUImage源码解读 介绍 GitHub - cats-oss/android-gpuimage: Android filters based on OpenGL (idea from GPUImage for iOS) 做图片或者视频滤镜渲染,离不开 OpenGL,而在移动平台上最令人熟知的就是 GitHub - BradLarson/GPUImage2: GPUImage 2 is ...

crazy_jack 2173

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

iOS GPUImage研究总结

关于GPUImage 这里直接引用官方描述:GPUImage是使用GPU处理图像的、他可以对图片、实时画面、视频进行处理。他允许你自定义滤镜、支持iOS4.0。然而,目前缺乏核心形象的一些更高级的功能,比如面部检测。

Quinn's blog ! I'm glad to be here! 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

iOS GPUImage源码解读

前言 GPUImage是iOS上一个基于OpenGL进行图像处理的开源框架,内置大量滤镜,架构灵活,可以在其基础上很轻松地实现各种图像处理功能。本文主要向大家分享一下项目的核心架构、源码解读及使用心得。 GPUImage有哪些特性 丰富的输入组件 摄像头、图片、视频、OpenGL纹理、二进制数据、UIElement(UIView, CALayer) 大量现成的内置滤镜(4大类) 1). 颜...

majiakun1的专栏 3613

iOS开发——GPUImage源码解析

一、基本概念 GPUImage:一个开源的、基于openGL的图片或视频的处理框架,其本身内置了多达120多种常见的滤镜效果,并且支持照相机和摄像机的实时滤镜,并且能够自定义图像滤镜。同时也很方便在原有基础上加入自己的滤镜Filter,所有滤镜是基于opengl shader(着色器)实现的,所以滤镜效果图像处理是在GPU上实现的,处理效率比较高,在iPhone6及其以上手机,可以做到实时流...

weixin_30240349的博客 378

GPUImage源码分析与使用(一)

有丰富的输入组件,可以处理图片、纹理、视频、二进制数据、UIElement(UIView、CALayer),可以使用GPUImage拍照、处理纹理图片、给视频或拍摄中的视频添加滤镜、添加水印可以使用UIElement。支持对大图进行处理,GPU的纹理限制是4096*4096,对于超出限制的图片,GPUImage会压缩处理导致损失图片质量,CoreImage会把图片拆解成小图处理。可以传入字符串类型,也可以传入文件类型,比如以.vsh/.fsh/.glsl等为后缀等命名的文件。

程序猿老樊的博客 1123

GPUImage源码解读(一)

导读: 系列文章会从结构到使用,细化到每一个变量, 使用方法全有对应 DEMO.也会有相对应的技术点扩展如(AVFoundation,OpenGL shader,CAEAGLLayer)等,目前是 Objective-C 版本的,后面会有Swift版本. GPUImage-Objective-C 官方源码 GPUImage-Swift 官方源码 GPUImage-Objective-C 添...

Philm_iOS的博客 802

c语言freeimage库文件,GPUImage源码解读之GLProgram

简述GLProgram是GPUImage中代表openGL ES 中的program,具有glprogram功能。其实是作者对OpenGL ES program的面向对象封装初始化- (id)initWithVertexShaderString:(NSString *)vShaderStringfragmentShaderString:(NSString *)fShaderString;- (id...

weixin_36176188的博客 303

GPUImage源码解读(二)

这篇文章主要是阅读GPUImage框架中的 GLProgram、GPUImageContext 两个重要类的源码。这两个类是 GPUImage 框架的基础,里面涉及的知识也有 OpenGL ES 基础 和 多线程 基础。以下是源码内容: GLProgram 一 GLProgram GLProgram专门处理OpenGL ES程序的创建等相关工作。 初始化方法,可以根据需要传入顶点着色...

Philm_iOS的博客 570

android 滤镜开源,Android_GPUImage 支持实时摄像头滤镜的GPUImage是iOS下一个开源的基于GPU的图像处理库 - 下载 - 搜珍网...

Android例子源码支持实时摄像头滤镜的GPUImage/Android例子源码支持实时摄像头滤镜的GPUImage/.gitignoreAndroid例子源码支持实时摄像头滤镜的GPUImage/library/Android例子源码支持实时摄像头滤镜的GPUImage/library/.classpathAndroid例子源码支持实时摄像头滤镜的GPUImage/library/.gitig...

weixin_36397146的博客 185

GPUImage源码解读之GLProgram

简述 GLProgram是GPUImage中代表openGL ES 中的program,具有glprogram功能。其实是作者对OpenGL ES program的面向对象封装 初始化 - (id)initWithVertexShaderString:(NSString *)vShaderString fragmentShaderString:(NSString *)fS...

weixin_30346033的博客 169

GPUImage源码解读(八)

GPUImageView 从名称就可以知道GPUImageView是GPUImage框架中显示图片相关的类。GPUImageView实现了GPUImageInput协议,从而可以知道它能够接受GPUImageFramebuffer的输入。因此,常常作为响应链的终端节点,用于显示处理后的帧缓存。 - 重写静态方法 返回 CAEAGLLayer GPUImageView 是UIView的子类...

Philm_iOS的博客 502

GPUImage源码解读(二十三)

GPUImageFilter GPUImageFilter 是GPUImage中很重要、很基础的类,它可以处理帧缓存对象的输入输出,但是对纹理并不添加任何特效,也就是说只是简单的让纹理通过。它更多的是作为其它滤镜的基类,一些具体的滤镜由它的子类去完成。同时它也只能处理单个帧缓存对象的输入,处理多个帧缓存对象的输入也是由它的子类去完成 向量定义 //在 GPUImage 中主要用到了3...

Philm_iOS的博客 485

GPUImage源码解读(二十五)

#GPUImageView 结构说明 . ├── GPUImage.xcodeproj │&amp;nbsp;&amp;nbsp; ├── project.pbxproj │&amp;nbsp;&amp;nbsp; ├── project.xcworkspace ├── GPUImageMac.xcodeproj │&amp;nbsp;&amp;nbsp; ├── project.pbxproj │&amp;nbsp;&amp;nbsp;

Philm_iOS的博客 458

GPUImage源码解读(七)

GPUImagePicture 从名称就可以知道GPUImagePicture是GPUImage框架中处理与图片相关的类,它的主要作用是将UIImage或CGImage转化为纹理对象。GPUImagePicture继承自GPUImageOutput,从而可以知道它能够作为输出,由于它没有实现GPUImageInput协议,不能处理输入。因此,常常作为响应链源。 初始化方法 ,所有初始化方法...

Philm_iOS的博客 475
上一篇: GPUImage源码解读(二十三)
下一篇: GPUImage源码解读(二十五)
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值