如果你看过
display an image with pyopengl and Pillow,就知道单单使用opengl来显示图片太复杂了,但如果你除了显示还做图片处理的话,那就不一样了,这里我给大家介绍一下基于opengl的图片处理。
在开始之前我需要解释一下什么是shader。
有三维软件(如:maya)基础的朋友,应该都知道shader这个名词,我们也习惯去称它为材质球,原因可能是我们在创建一个shader的时候,它的截图多是一个球形的。
其实shader是一个程序,而且是只在gpu上面运行的程序,它的编译是实时的。
我们来回顾一下display an image with pyopengl and Pillow里shader的加载
# create shader from file
vshader = shaderFromFile(GL_VERTEX_SHADER, 'shader.vert')
fshader = shaderFromFile(GL_FRAGMENT_SHADER, 'shader.frag')
# compile shaders
self.sprogram = shaders.compileProgram(vshader, fshader)
由这段代码我们可以知道,它的编译是实时的,先是创建shader,然后把所有的shader进行连接编译,这与c和c++的程序编译是一样的道理,只是你无法得到一个可执行程序文件,而是只能得到程序的ID。
什么是FRAGMENT SHADER?
opengl里有好几种类型的shader,而FRAGMENT SHADER则是负责处理像素的,就是你最终显示在屏幕上的颜色的像素。在这个shader里你可以直接操控像素值,来得到你想要的效果。
这样一来opengl在处理图片的时候就显得更方便,更强大了。
现在的问题就剩:我们怎么做图片处理?
在我学习opencl的时候,也就是
convert color image to grayscale with pyopencl(example code) 的那段时间,我就研究了一下图片处理,有一个很简单的方式:3 X 3 滤镜
什么是3X3滤镜?
看上图,左边是我们图片的坐标,每一格是一个像素,右上角是我们的3X3滤镜。
首先我们从图片中获取当前像素,就是绿色的那个值,然后我们在依次获取这个像素附近的8个像素值,然后将所有的像素值跟对应的滤镜值相乘,在把相乘的所有结果进行相加,在把相加的结果除以一个阀值,就得出我们新的像素值了。阀值是滤镜里所有数字的和,如果这个和为0,那就是1,因为我们不能进行除0。
换成代码就是
color0 = 53 * 11
color1 = 124 * 0
color2 = 19 * -2
color3 = 42 * 0
color4 = 110 * -2
color5 = 44 * -2
color6 = 19 * 0
color7 = 60 * -2
color8 = 100 * 0
color = color0+color1+color2+color3+color4+color5+color6+color7+color8
factor = 0 + -2 + 0 + -2 + 11 + -2 + 0 + -2 + 0
if factor == 0:
factor = 1
color /= factor
当然不是所有的效果都能通过除以上面的阀值就能得到,但像素的取样方式是一样的,不一样的只是后面的新像素计算。
如果你需要更强烈的效果,可以使用5X5,7X7的滤镜。
浮雕效果
边缘检测
完整的代码可以在这里获得
https://github.com/mackst/opengl-samples/tree/master/imageProcess
ps. 空格可以切换滤镜[using space bar to switch filters]。
- 大小: 343 KB
- 大小: 515.5 KB
- 大小: 504.8 KB
分享到:
相关推荐
IOS 开发源码1: 基于openGL 的图片处理:如色彩等.
在基于OpenGL的Android系统中实现视频转换功能,可能涉及到以下步骤: 1. 使用OpenGL ES进行视频帧的解码,将视频数据转化为纹理。 2. 应用顶点和纹理坐标,将视频帧渲染到屏幕上。 3. 实现视频压缩,可能涉及编码...
在“50多种的图片处理效果_运用OpenGL ES.zip”这个压缩包中,包含了使用OpenGL ES Shader进行图像处理的各种示例。Shader是OpenGL ES中用于处理图形的程序,它们运行在GPU上,能够高效地执行复杂的计算,尤其是在...
在这个"基于OpenGL的人脸识别技术"的项目中,我们探讨的是如何结合OpenGL与人脸识别算法来实现图像和图片中人脸的检测和识别。 首先,人脸识别技术是一种计算机视觉技术,它能够通过分析和比较人的面部特征来识别或...
在这个“基于OpenGL的地球三维显示”项目中,我们重点探讨如何在Visual C++(简称VC)环境中利用OpenGL构建一个交互式的地球三维模型。 首先,我们需要理解OpenGL的工作原理。OpenGL是一个跨语言、跨平台的图形库,...
【基于OpenGL的虚拟汽车驾驶系统】是一个利用C++编程语言和OpenGL图形库开发的项目,主要目的是实现一个逼真的模拟驾驶环境。OpenGL是开放源代码的图形库,它提供了丰富的图形绘制功能,常用于游戏开发、科学可视化...
这个名为“cpp-基于OpenGL和GLUT的C类库”的项目,旨在简化使用OpenGL和GLUT进行图形编程的过程,通过封装成C++类的形式,提供更易用的接口。 OpenGL全称是“Open Graphics Library”,它是一个跨语言、跨平台的...
【项目介绍】:基于 OpenGL ES 实现图片局部拉伸功能的控件,可以用来实现长腿功能。 将图片分割为 6 个三角形,如下图所示,然后对中间矩形(V2~V5)进行拉伸或压缩处理。 渲染到纹理 当单次图片编辑结束之后,...
学习这个源码,开发者可以深入理解OpenGL的使用,包括基本的几何绘制、颜色填充、光照处理,以及如何通过键盘事件驱动游戏的进行。同时,也可以学习到C++面向对象编程的思想,以及如何组织和管理代码结构。对于想要...
《LGame0.3.3安卓游戏框架源码解析——基于OpenGLES》 LGame0.3.3是一款专为安卓平台设计的游戏开发框架,它充分利用了OpenGLES技术来实现高性能的游戏图形渲染。OpenGLES(OpenGL for Embedded Systems)是OpenGL...
在Windows环境中,结合MFC(Microsoft Foundation Classes)库,我们可以创建基于对话框的应用程序来展示OpenGL图形。 在“基于对话框的OpenGL程序框架”中,主要涉及到以下几个关键知识点: 1. **OpenGL上下文...
在这个"基于OpenGL的3ds数据可视化"项目中,我们主要关注如何利用OpenGL读取并渲染3DS(Autodesk 3D Studio)文件格式的数据。3DS文件是3D建模软件3D Studio Max保存模型和场景的标准格式,包含几何信息、材质、纹理...
本项目"Android网络图片基于OpenGL的翻书效果 OpenBook.rar"提供了一种创新的方法来展示图片,即通过模拟真实的翻书动画,使得数字内容具有更丰富的交互性。这个解决方案不仅适用于本地存储的图片,还能加载网络上的...
加载成功后,将图片数据转换为OpenGL可以处理的格式,通常是RGBA格式。 4. **创建和绑定纹理**:使用glGenTextures()生成纹理ID,然后用glBindTexture()绑定到当前上下文。接着,使用glTexParameteri()设置纹理参数...
10. **现代OpenGL**:随着OpenGL版本的升级,旧的固定功能管线逐渐被废弃,取而代之的是基于着色器的编程模型。使用`glCreateShader`、`glShaderSource`、`glCompileShader`编译顶点和片段着色器,再通过`...
在这个“基于OpenGL的三维动态字母绘制”项目中,开发者利用OpenGL创建了一个动态展示的三维字母Aa,包括其大写和小写形式。这个程序不仅展示了基本的三维几何形体建模,还涉及到了物体在三维空间中的变换、材质与...
【标题】:“一款基于OpenGL的虚拟漫游小游戏” 这款虚拟漫游小游戏的开发基于OpenGL图形库,这是一种广泛用于创建3D图形和实时交互应用的技术。OpenGL是一个跨语言、跨平台的应用程序编程接口(API),它提供了...
通常,环境贴图可以通过全景图片或通过环绕相机拍摄的一系列图像合成。 以下是实现环境纹理映射的步骤: 1. **加载环境贴图**:使用`glGenTextures`生成纹理ID,然后使用`glBindTexture`绑定到目标纹理类型(在...
《基于OpenGL的3D旋转魔方实现》 在计算机图形学领域,OpenGL是一个强大的图形库,用于创建2D和3D图像。在这个项目中,我们将深入探讨如何利用OpenGL来实现一个3D旋转魔方,相较于老师提供的2阶魔方,3阶魔方具有更...
TinySeal是一款基于OpenGL在iOS平台上开发的游戏,其源代码为我们提供了一个深入理解iOS游戏开发,特别是图形渲染技术的宝贵资源。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形。它在iOS游戏开发...