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

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值