`
schi
  • 浏览: 205810 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于opengl的图片处理

阅读更多
如果你看过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 openGL 图片处理源码

    IOS 开发源码1: 基于openGL 的图片处理:如色彩等.

    如何基于OpenGL实现视频处理

    在基于OpenGL的Android系统中实现视频转换功能,可能涉及到以下步骤: 1. 使用OpenGL ES进行视频帧的解码,将视频数据转化为纹理。 2. 应用顶点和纹理坐标,将视频帧渲染到屏幕上。 3. 实现视频压缩,可能涉及编码...

    50多种的图片处理效果_运用OpenGL ES.zip

    在“50多种的图片处理效果_运用OpenGL ES.zip”这个压缩包中,包含了使用OpenGL ES Shader进行图像处理的各种示例。Shader是OpenGL ES中用于处理图形的程序,它们运行在GPU上,能够高效地执行复杂的计算,尤其是在...

    基于opengl的人脸识别技术

    在这个"基于OpenGL的人脸识别技术"的项目中,我们探讨的是如何结合OpenGL与人脸识别算法来实现图像和图片中人脸的检测和识别。 首先,人脸识别技术是一种计算机视觉技术,它能够通过分析和比较人的面部特征来识别或...

    基于OpenGL的地球三维显示

    在这个“基于OpenGL的地球三维显示”项目中,我们重点探讨如何在Visual C++(简称VC)环境中利用OpenGL构建一个交互式的地球三维模型。 首先,我们需要理解OpenGL的工作原理。OpenGL是一个跨语言、跨平台的图形库,...

    基于OPENGL的虚拟汽车驾驶系统

    【基于OpenGL的虚拟汽车驾驶系统】是一个利用C++编程语言和OpenGL图形库开发的项目,主要目的是实现一个逼真的模拟驾驶环境。OpenGL是开放源代码的图形库,它提供了丰富的图形绘制功能,常用于游戏开发、科学可视化...

    cpp-基于OpenGL和GLUT的C类库

    这个名为“cpp-基于OpenGL和GLUT的C类库”的项目,旨在简化使用OpenGL和GLUT进行图形编程的过程,通过封装成C++类的形式,提供更易用的接口。 OpenGL全称是“Open Graphics Library”,它是一个跨语言、跨平台的...

    基于 OpenGL ES 实现图片局部拉伸功能的控件,可以用来实现长腿功能

    【项目介绍】:基于 OpenGL ES 实现图片局部拉伸功能的控件,可以用来实现长腿功能。 将图片分割为 6 个三角形,如下图所示,然后对中间矩形(V2~V5)进行拉伸或压缩处理。 渲染到纹理 当单次图片编辑结束之后,...

    OpenGL立体俄罗斯方块源码

    学习这个源码,开发者可以深入理解OpenGL的使用,包括基本的几何绘制、颜色填充、光照处理,以及如何通过键盘事件驱动游戏的进行。同时,也可以学习到C++面向对象编程的思想,以及如何组织和管理代码结构。对于想要...

    LGame0.3.3安卓游戏框架源码 基于OpenGLES

    《LGame0.3.3安卓游戏框架源码解析——基于OpenGLES》 LGame0.3.3是一款专为安卓平台设计的游戏开发框架,它充分利用了OpenGLES技术来实现高性能的游戏图形渲染。OpenGLES(OpenGL for Embedded Systems)是OpenGL...

    基于对话框的OpenGL程序框架

    在Windows环境中,结合MFC(Microsoft Foundation Classes)库,我们可以创建基于对话框的应用程序来展示OpenGL图形。 在“基于对话框的OpenGL程序框架”中,主要涉及到以下几个关键知识点: 1. **OpenGL上下文...

    基于OpenGL的3ds数据可视化

    在这个"基于OpenGL的3ds数据可视化"项目中,我们主要关注如何利用OpenGL读取并渲染3DS(Autodesk 3D Studio)文件格式的数据。3DS文件是3D建模软件3D Studio Max保存模型和场景的标准格式,包含几何信息、材质、纹理...

    Android网络图片基于OpenGL的翻书效果 OpenBook.rar

    本项目"Android网络图片基于OpenGL的翻书效果 OpenBook.rar"提供了一种创新的方法来展示图片,即通过模拟真实的翻书动画,使得数字内容具有更丰富的交互性。这个解决方案不仅适用于本地存储的图片,还能加载网络上的...

    qt基于QOpenGLWidget显示图片

    加载成功后,将图片数据转换为OpenGL可以处理的格式,通常是RGBA格式。 4. **创建和绑定纹理**:使用glGenTextures()生成纹理ID,然后用glBindTexture()绑定到当前上下文。接着,使用glTexParameteri()设置纹理参数...

    图像处理OPENGL

    10. **现代OpenGL**:随着OpenGL版本的升级,旧的固定功能管线逐渐被废弃,取而代之的是基于着色器的编程模型。使用`glCreateShader`、`glShaderSource`、`glCompileShader`编译顶点和片段着色器,再通过`...

    基于openGL的三维动态字母绘制

    在这个“基于OpenGL的三维动态字母绘制”项目中,开发者利用OpenGL创建了一个动态展示的三维字母Aa,包括其大写和小写形式。这个程序不仅展示了基本的三维几何形体建模,还涉及到了物体在三维空间中的变换、材质与...

    一款基于opengl的虚拟漫游的小游戏

    【标题】:“一款基于OpenGL的虚拟漫游小游戏” 这款虚拟漫游小游戏的开发基于OpenGL图形库,这是一种广泛用于创建3D图形和实时交互应用的技术。OpenGL是一个跨语言、跨平台的应用程序编程接口(API),它提供了...

    基于OpengL的环境纹理映射实现

    通常,环境贴图可以通过全景图片或通过环绕相机拍摄的一系列图像合成。 以下是实现环境纹理映射的步骤: 1. **加载环境贴图**:使用`glGenTextures`生成纹理ID,然后使用`glBindTexture`绑定到目标纹理类型(在...

    基于opengl的3D旋转魔方实现

    《基于OpenGL的3D旋转魔方实现》 在计算机图形学领域,OpenGL是一个强大的图形库,用于创建2D和3D图像。在这个项目中,我们将深入探讨如何利用OpenGL来实现一个3D旋转魔方,相较于老师提供的2阶魔方,3阶魔方具有更...

    TinySeal基于opengl实现的IOS游戏源代码

    TinySeal是一款基于OpenGL在iOS平台上开发的游戏,其源代码为我们提供了一个深入理解iOS游戏开发,特别是图形渲染技术的宝贵资源。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形。它在iOS游戏开发...

Global site tag (gtag.js) - Google Analytics