在HTML 5 的 Canvas 中应用卷积矩阵对图像处理

HTML 5中的 canvas 元素是相当强大的,利用他的 getImageData 方法可以对载入的图像直接进行位图操作。但是直接对位图进行操作比较麻烦,如果利用卷积矩阵这个工具的话,可以通过几个简单的参数实现复杂的效果。

所谓的矩阵的卷积,就是如下图显示的那样,当计算红色框中的数值的时候,分别先提取周围绿框中8个数字,然后与施加的那个矩阵中对应位置相乘,然后把各个乘积加在一起,就得到了最终的值了。

卷积矩阵的运算

比如上图中的42是这么来的:

  (40*0)+(42*1)+(46*0)
+ (46*0)+(50*0)+(55*0)
+ (52*0)+(56*0)+(58*0)
= 42

这就是卷积了。然后,所谓的对图像的卷积操作,就是指对图像上的每一点的像素值,用这个矩阵进行运算,得到一个新的值。

比如下面这张图
卷积矩阵原图
利用下面这个矩阵
-6 -3 0
-3 -1 3
0 3 6
就立刻能够得到浮雕效果。

卷积矩阵浮雕效果

然后为了使用更方便,通常还会给最终值除以一个系数以及加上一个偏移。
比如下面这个矩阵。
0 0 0
0 1 0
0 0 0
这个矩阵(实际上这个矩阵本身不对图像进行任何操作),然后设置系数为-1,偏移为255的话,就能实现反色效果了,真是相当的神奇。
卷积矩阵反色效果

为了简化操作,我写了个简单的函数来对图像数据进行操作。
函数第一个参数是 canvas上的 imageData 对象
第二个参数是传入矩阵所对应的数组,如果是下面这样的矩阵
a b c
d e f
g h i
则传入第二个的参数应为 [a,b,c,d,e,f,g,h,i]
第三个参数是除数因子。
第四个参数就是偏移量。

// 计算卷积矩阵的函数
function ConvolutionMatrix(input, matrix, divisor, offset){
// 创建一个输出的 imageData 对象
var output = document.createElement(“canvas”)
.getContext(‘2d’).createImageData(input);

var w = input.width, h = input.height;
var iD = input.data, oD = output.data;
var m = matrix;

// 对除了边缘的点之外的内部点的 RGB 进行操作,透明度在最后都设为 255
for (var y = 1; y < h-1; y += 1) { for (var x = 1; x < w-1; x += 1) { for (var c = 0; c < 3; c += 1) { var i = (y*w + x)*4 + c; oD[i] = offset +(m[0]*iD[i-w*4-4] + m[1]*iD[i-w*4] + m[2]*iD[i-w*4+4] + m[3]*iD[i-4] + m[4]*iD[i] + m[5]*iD[i+4] + m[6]*iD[i+w*4-4] + m[7]*iD[i+w*4] + m[8]*iD[i+w*4+4]) / divisor; } oD[(y*w + x)*4 + 3] = 255; // 设置透明度 } } return output; }

我这里只写了个3阶的卷积矩阵。如果觉得不够high还可以自己实现一个5阶的。
gimp自带卷积矩阵的滤镜,photoshop里我没找到。
关于gimp的卷积矩阵滤镜可以参考: http://docs.gimp.org/en/plug-in-convmatrix.html

我写的更多效果直接查看: http://shawphy.github.com/share/2011/matrix.html

关于 canvas 的资料可以查看 https://developer.mozilla.org/cn/Canvas_tutorial

八卦:HTML 5的由来

这篇文章纯属八卦,不过会给出消息来源,可信度尽量保证。

首先要说,HTML5的发展历史,下面引用维基百科上关于HTML5的阐述:

HTML 5草案的前身名为Web Applications 1.0,是在2004年由WHATWG提出,再于2007年获W3C接纳,并成立了新的HTML工作团队。在2008年1月22日,第一份正式草案发布。WHATWG表示该规范是目前仍在进行的工作,仍须多年的努力。目前Firefox、Chrome、Opera、Safari(版本4以上)及Internet Explorer 9(Platform Preview)已支援HTML5技术。

HTML 5的标准草案目前已进入W3C制定标准5大程序的第1步。负责编纂标准格式文件的Google代表Ian Hickson预期,可能得等到2012年才会推出建议候选版(W3C Candidate Recommendation)。

可以看到,这里HTML 5的前身就是WHATWG提出的Web Applications 1.0,要问知道HTML 5怎么来的,进一步要探讨WHATWG这个组织是怎么来的。

根据WHATWG官方FAQ上显示,这个组织最早是由Apple、 the Mozilla Foundation 和 Opera Software 这三家公司,在2004年的时候成立了。那当时到底是谁先发起的,这三家如何纠结在一起的呢?这里我首当其冲猜测是Apple公司勾引了另两家公司。乔布斯狼子野心想通过HTML 5的video标签和canvas标签来灭掉Adobe!苹果和Adobe有恩怨大家都知道~咳咳……似乎04年的时候Adobe还没收购Flash呢,当时还在Macromedia手中呢……呃,那一定是乔布斯那个时候就已经打算灭掉Flash了!嗯!

当时在群里讨论的时候,神飞飘来w3上的一个地址 ,里边提到,最早是由Mozilla基金会和Opera两家公司在一起弄的这个WHATWG组织。Apple是后来才加入进来的。呃………………看来我错怪乔布斯大爷了。但我还有个问题,当年Mozilla和Opera,到底是谁最先勾结对方的呢……

一筹莫展之际,有一个人引起了我的注意,此人就是刚才维基条目中提到的Ian Hickson。此人目前在Google工作。这位仁兄何许人也?仔细一查,发现不得了。在W3C 的 HTML 5 规范中,他就是编辑。而最早WHATWG写的文档,也都是放在Ian Hickson的个人网站上的。看来HTML 5的诞生与此人有着莫大的关系。继续扒一扒他吧。

用Google搜Ian Hickson,第一条就是他维基百科的条目(有其他人为自己建立维基条目,那这人这辈子也值了吧……),原来此人就是大名鼎鼎的 Acid 2Acid 3的作者。在上面找到了Ian Hickson简历的地址。哈哈,基本上找到了事情的全貌了。

================

事情的原委是这样的,自从02年,W3C终于把 XHTML 1.0 的第二版作为推荐标准之后,开始被胜利冲昏了头脑,他们妄图让HTML 完全进化成 XML。在02到06年之间,他们都在使劲折腾XHTML 2.0,这是个完美的标准,完美到与先前“污秽”“肮脏”的HTML完全不兼容。

而Ian Hickson,02年时候刚从英国巴斯大学物理系本科毕业,00年起就在W3C的CSS工作组有活动了。并且大学时起就已经混迹在Mozilla基金会里了。03年的时候受雇于Opera的研发部门,主要工作之一就是作为Opera的代表,在W3C中施加影响,促进标准的推进。

刚才已经说到了,W3C的那帮子天才们太过激进了(以Stephen Pemberton为首),完全无视浏览器厂商的诉求。一次W3C内部会议上,Ian提出对HTML进行一些扩展和改进,跟XHTML2标准制定的工作并行展开。结果投票结果是——“反对”。他们认为HTML已死,XHTML2才是我们的未来!于是,Ian Hickson怀着对W3C深深的忧虑,因爱生恨。干脆自立门户了。由于他本身就在Opera中,又在Mozilla基金会里混的脸熟。很快他们俩家就在Ian的牵线搭桥下,成立了WHATWG组织。后来他们觉得势单力薄,又拉拢了Apple公司一起入伙搞这个标准。

他没把微软拉进来,以及成立WHATWG组织的初衷之一就是为了替Opera公司来牵制微软的IE。很明显IE当时是市场的老大,老二老三老四抱团联合起来对抗老大是再正常不过的事情了。之前他们还可以对W3C施加影响来垂帘听政,现在可好,W3C那帮子疯子以为自己多么了不起了,没浏览器厂商给你们实现标准,你们得瑟个P啊。于是乎,三家人家一拍即合,组团成立一个新的政权,架空W3C的权利,来制衡微软。(其实被架空的只是W3C中的HTML小组,其他的如CSS、SVG之类的小组都还挺好的)

到了05年,Ian跳槽到了Google。Google是很有野心的。自从04年Google推出Gmail起就已经意识到了,自己的未来不能被帮浏览器厂商掌控,自己也要有话语权,也要参与制定标准。雇佣Ian的主要目的恐怕就在于此,一方面Ian代表Google在W3C的CSS小组以及其他小组施加影响,另一方面推进WHATWG的工作。并且Google确实在08年末的时候推出了Chrome,来实现自己的霸业。

06年的时候,W3C终于意识到自己被架空了……HTML的发明者之一Tim Berners-Lee发表了一篇博客,表示我们错了……次年,W3C宣布正式接纳并合并WHATWG的工作为HTML 5。于是乎,后面的事情,大家都知道了。

================
八卦的最后,是两篇扩展阅读:
成长的烦恼 — HTML5 标准之争 这篇会告诉你一些最新的八卦,HTML 5 现在又遇到了什么麻烦了。
HTML5设计原理 这篇会告诉你 HTML 5 如何从实用的角度出发来设计出来的。强烈推荐!!!