基于opengl的图片处理

如果你看过[url=http://schi.iteye.com/blog/2042572]display an image with pyopengl and Pillow[/url],就知道单单使用opengl来显示图片太复杂了,但如果你除了显示还做图片处理的话,那就不一样了,这里我给大家介绍一下基于opengl的图片处理。

[size=medium]在开始之前我需要解释一下什么是shader。[/size]
有三维软件(如: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。

[size=large]什么是FRAGMENT SHADER?[/size]
opengl里有好几种类型的shader,而FRAGMENT SHADER则是负责处理像素的,就是你最终显示在屏幕上的颜色的像素。在这个shader里你可以直接操控像素值,来得到你想要的效果。

这样一来opengl在处理图片的时候就显得更方便,更强大了。

现在的问题就剩:我们怎么做图片处理?
在我学习opencl的时候,也就是[url=http://schi.iteye.com/blog/1826850]convert color image to grayscale with pyopencl(example code) [/url]的那段时间,我就研究了一下图片处理,有一个很简单的方式:3 X 3 滤镜

[size=large]什么是3X3滤镜?[/size]

[img]http://www.studentguru.gr/blogs/jupiter/MatrixFilter_thumb_52A4B8EC.png[/img]

看上图,左边是我们图片的坐标,每一格是一个像素,右上角是我们的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的滤镜。

浮雕效果

[img]http://dl2.iteye.com/upload/attachment/0095/9597/b420b9c9-4af5-3eb8-b497-19f376776faf.png[/img]

边缘检测

[img]http://dl2.iteye.com/upload/attachment/0095/9599/f381a784-f18d-3ed0-9c01-d6e880d81742.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0095/9601/73d4f2a0-94fb-34e7-8c80-26af6dfb7bb3.png[/img]


完整的代码可以在这里获得
[url]https://github.com/mackst/opengl-samples/tree/master/imageProcess[/url]
ps. 空格可以切换滤镜[using space bar to switch filters]。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值