java lowpoly低多边形风格图片生成

来源:互联网 发布:java实现下载断点续传 编辑:程序博客网 时间:2024/04/30 00:27

lowpoly风格的图片生成,java实现。

闲着没事干刷知乎,刷到这样一个问题http://www.zhihu.com/question/29856775

看看觉得还是挺好看的,那么,我也想提高b格走一波。于是乎根据前人的经验,用java实现了一波,效果不错,根据原图生成效果如下:


有没有很酷的感觉,哈哈哈哈。

源码在文章最后有打包,想直接看源码的下拉!

看完效果,我们来说下原理。

首先,一张图片,难点是如何拼出来这些三角形?

第一步,我们先确定边缘点,用这些点去生成这堆三角形。

边缘点如何确定?【sobel算子是常用的方法。

具体的算法内容我也解释不清,实现就是

【0,-1,0】

【-1,4,,-1】

【0,-1,0】

用这个矩阵去和图片矩阵做卷积和。

得出来新的图片中再根据灰度过滤出来一些点。

大概实现如下:

BufferedImage newPic = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_3BYTE_BGR);float[] elements = { 0.0f, -1.0f, 0.0f, -1.0f, 4.0f, -1.0f, 0.0f,-1.0f, 0.0f };Kernel kernel = new Kernel(3, 3, elements);ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);cop.filter(originalPic, newPic);return newPic;
这里就得到了新的灰度图,然后过滤一些点。

for (int y = 1; y < height - 1; ++y){for (int x = 1; x < width - 1; ++x){int rgb=buf.getRGB(x, y);rgb=(rgb & 0xff0000) >> 16;//留灰度if(rgb>graMax){//dt.delaunayPlace(new Pnt(x,y));//加入三角点pnts.add(new MyPoint(x,y));//outBinary.setRGB(x, y, 0xffffffff);}}}
灰度大于特定值的点我们才取,一般用30,40左右。

(为了效率,我们需要控制最后点的数量,所以先把点存入list,然后打乱,随机取出特定数量,我这里使用4000个点来生成三角形,

即使只有4000个点,我的破笔记本还是用了1分钟来生成最后的效果图,所以需要耐心等待。。。)

那么,现在我们有了一堆点,接下来呢?

接下来用这些点拼接三角形。我们使用【Delaunay三角剖分算法具体的思路参考这里:

Watson算法的基本步骤是:1、构造一个超级三角形,包含所有散点,放入三角形链表。2、将点集中的散点依次插入,在三角形链表中找出外接圆包含插入点的三角形(称为该点的影响三角形),删除影响三角形的公共边,将插入点同影响三角形的全部顶点连接起来,完成一个点在Delaunay三角形链表中的插入。3、根据优化准则对局部新形成的三角形优化。将形成的三角形放入Delaunay三角形链表。4、循环执行上述第2步,直到所有散点插入完毕。

来自于百度百科:http://baike.baidu.com/link?url=pQU5YL2rQxa50zO7NWS10uUdOEIIv8h4QaNGKE_-tftyIpbMxhhP0wxZ-RqIePPHhKyn_PA8vInKAJ8n2NYB-_

如果想深入了解的话,建议去搜搜其他博文。

由于我自己对三角剖分的理解不足,所以我这里采用了别人的算法实现。


最后一步,我们构建好了所有的三角形,取出每个三角形中间点的颜色填充三角形,于是乎,就有了开头的效果图。


最后的最后。所有源码的打包,运行PicDemo就可以查看演示,记得自行更改图片的路径!!!


链接: http://pan.baidu.com/s/1pKeHjJ1 密码: dvnd

1 0
原创粉丝点击