如果你看过
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源代码,实现了3D建模和视频播放功能。...图片转换视频等功能。 是一个总结性的文档。 有兴趣了解的可以看下我的博客(刚发布到微博,还处于审核中),如果希望下载。也可以下载此文档。
这是一个基于 OpenGL 和 GLUT 的 C 类库,将 OpenGL 的绘图操作和 GLUT 提供的 GUI 相关操作整理成类,方便使用。
FingerScanner3D图片浏览器VC.net版,基于 OpenGL技术编写,可对图片进行旋转操作,运行时候需要你的电脑装有.NET框架,最好安装VS2008编译环境,要不然不能运行EXE。
神笔马良有一支神笔。MaLiang 是一个基于 OpenGL ES 的涂鸦库,支持自定义画笔纹理、线条粗细、颜色等。
使用OpenGlES对图片进行模糊,冷暖色调等处理, 编写glsl着色器语言,基于Camera + GlSurfaceView实现相机实时预览,实时美颜,实时预览滤镜功能,以及对相册单张图片进行编辑,美颜,滤镜功能, 和脱离...
基于OpenGL ES实现图片局部拉伸功能的控件,可以实现长腿功能。 效果展示 原理 将图片分割为6个三角形,如下图所示,然后对中间矩形(V2〜V5)进行拉伸或压缩处理。 渲染到纹理 当单次图片编辑结束之后,需要重新...
数字图像处理基本模版 ,可以打开并显示BMP图片
SmartGL是一个用于创建Android游戏和App的图形引擎。它基于OpenGL并处理2D精灵和3D纹理对象。
Android通用流行框架大全 1. 缓存 ...Picasso-transformations一个为Picasso提供多种图片变换的库Glide-transformations一个为Glide提供多种图片变换的库Android-gpuimage基于OpenGL的Android过
目前音视频相关处理: - #### 音频剪切、拼接 - #### 音频混音 - #### 音频转码 - #### 音视频合成 - #### 音频抽取 - #### 音频解码播放 - #### 音频编码 - #### 视频抽取 - #### 视频剪切 - #### 视频转码 - ...
印象派 #####您必须在印象派程序中添加以下功能: 实施5种不同的画笔类型:单条线,散线,散点,(实心)圆和散布(实心)圆。 有关每个画笔外观的示例,请参见示例解决方案。 请注意,分散的画笔应从它们各自着色...
RedWebImage 是一个基于 WebGL 的滤镜系统,我们将使用 OpenGL ES 作为硬件加速,做一个高性能的 img 标签。
一个类似VLC的播放器,能播放本地媒体文件、捕获设备、网络流;自由切换画面风格,支持拖拽;... 使用OpenCV处理图片; 使用OpenGL渲染视频帧 原版主:https://blog.csdn.net/GG_SiMiDa/article/details/80764211
Adobe Photoshop CS5 Extended,让大家抢先体验非同凡响的图片处理特效。 Photoshop CS5 配置要求: * Intel Pentium 4 或 AMD Athlon 64 处理器 * Microsoft Windows XP(带有 Service Pack 3);Windows Vista Home ...
源码 android端基于FFmpeg库的使用。添加编译ffmpeg、shine、mp3lame、x264源码的参考脚本 目前音视频相关处理: 音频剪切、拼接 音频混音 音频转码 音视频合成 音频抽取 音频解码播放 音频编码 视频抽取 视频剪切 ...
3DModeling 基于2D图像的3D人体建模 所用语言:C++ 所用库:OpenGL, OpenCV 二维图片1:人体正面图 二维图片2:人体背面图 二维图片3:人体侧面图 图像处理生成标准图4(用于3D标准模型的纹理贴图)
基于FFmpeg,OpenGL / SL自研万能音视频播放器(已完成) 导入MP3格式,为录制的音频源(已完成) 音频视频录制合成mp4(已完成) 滤镜(已完成) 水印(已完成) 倍速播放(已完成) 速率录制(已完成极慢/慢/标准/...
源码XBImageFilters,XBImageFilters 允许你对图片已经摄像头拍摄的照片进行实时过滤,也是一款基于OpenGL ES 2的图片处理和实时过滤摄像头相片的iOS类库。它是使用OpenGL ES 2编写的图像着色过滤器,可以快速的过滤...
8.7 实例:基于图片记录查询 8.8 实例:数据库基本浏览 8.9 实例:基本数据处理 9.6 实例:曼德布洛特集合 11.16 实例:鼠标校准程序 11.17 实例:加速图形驱动 11.18 实例:在嵌入式系统中使用OpenGL