java 图像特效之霓虹

来源:互联网 发布:c语言不等于 编辑:程序博客网 时间:2024/04/30 05:47

阅读本系列,请先看前言!谢谢

老实说,我也不知道什么是霓虹,但是在网上搜滤镜算法的时候看到了这个算法,就顺手实现了,所以童鞋们有什么想要实现的算法,可以把原理告诉我~

事实上,它实现的结果和我之后要写的彩色边缘很像,都奉献给大家了。

算法原理:

对于3*3点阵,首先计算原图象像素f(i,j)的红,绿,蓝分量与相同行f(i+1,j)及同列f(i,j+1)相邻象素的梯度,即差的平方之和的平方根,然后将梯度值作为处理后的象素g(i,j)的红,绿,蓝分量值。
设r1,g1,b1分别为原图象象素f(i,j)的红,绿,蓝分量值,r2,g2,b2分别为相同行相邻象素f(i+1,j)的红,绿,蓝分量值,r3,g3,b3分别为同列相邻象素f(i,j+1)的红,绿,蓝分量值,rr,gg,bb为处理后象素g(i,j)的红,绿,蓝分量值,则:
rr1=(r1-r2)^2  rr2=(r1-r3)^2
gg1=(g1-g2)^2  gg2=(g1-g3)^2
bb1=(b1-b2)^2  bb2(b1-b3)^2
rr=2*(rr1+rr2)^0.5
gg=2*(gg1+gg2)^0.5
bb=2*(bb1+bb2)^0.5

Ok,上代码:

public Image filter() {int[] d = new int[this.img.w*this.img.h]; //must be writed as this.not int[] d = this.img.data;for (int y = 0; y < this.img.h-1; y++) {            for (int x = 0; x < this.img.w-1; x++) {                            int c = this.img.data[x + y * this.img.w];                int r = (c >> 16) & 0xFF;                int g = (c >> 8) & 0xFF;                int b = (c >> 0) & 0xFF;                                int Rowc = this.img.data[x + 1 + y * this.img.w];//相同行                int r1 = (Rowc >> 16) & 0xFF;                int g1 = (Rowc >> 8) & 0xFF;                int b1 = (Rowc >> 0) & 0xFF;                 int Colc = this.img.data[x + (y + 1)* this.img.w];//相同列                int r2 = (Colc >> 16) & 0xFF;                int g2 = (Colc >> 8) & 0xFF;                int b2 = (Colc >> 0) & 0xFF;                                int tr =(int)(2*Math.sqrt(((r-r1)*(r-r1)+(r-r2)*(r-r2))));                int tg =(int)(2*Math.sqrt(((g-g1)*(g-g1)+(g-g2)*(g-g2))));                int tb =(int)(2*Math.sqrt(((b-b1)*(b-b1)+(b-b2)*(b-b2))));                                d[x + y * this.img.w] = (255 << 24) | (math.st(tr) << 16) | (math.st(tg) << 8) | math.st(tb);            }        }this.img.data = d;return this.img;}

运行结果:

最后一个太漂亮了,实在不忍心添加水印破坏美感

以上

0 0