本文由PHP100中文网编译,转载请看文末的转载要求,谢谢合作!
给你一副真彩画,你的任务是要完成这个图像的另一个版本,让它看起来就像是用数字彩笔画上去的一样(孩子们经常这样玩)。随着开始画图,你有两个参数可以设定:P,调色板的最大尺寸(即使用不同颜色的最大数量),和N,使用的单元格的最大数量。你的算法不必非要使用所有的P颜色和N单元格,但它一定不能使用这之外的东西。输出的图像应该与输入的图像有相同的尺寸。
单元格被定义为具有相同颜色像素的连续区域。像素仅接近在一个角落不被认为是连续的。单元格可能有中空的现象。
简而言之,你只能通过N个平坦的阴影或固色区域以及P个不同的颜色来粗略估计输入的图像。
为了视觉化参数,这有一个很简单的例子(对于没有特别输入的图像时,炫耀下我牛逼的绘画技能嘿嘿)。下面这个图像的参数是P=6,N=11。
这有几个能测试你算法的图像。
请包含一些不同参数的一系列结果。如果你想展示大量的结果,你可以在imgur.com创建一个画廊,以保持回应图像尺寸的合理性。另外,把缩略图放到你的文章里,并且把他们连接到更大的图像上面,就像上面的图像那样,也是个不错的做好。此外,随意使用其他测试图像吧,如果你找到一些比较好的图像的话。
我认为,在大约N>=500,P~30的时候,输出将类似于真正的数字水彩模板了。
这是一个人气竞赛,所以投票越多的回应作品才会获胜。投票者可以通过这几方面来判断作品的优劣:
1.原始图像被估计的有多好
2.算法在不同种类的图像上能适用多好(绘画可能通常比照片更容易)
3.算法在非常严格的参数下效果有多好
4.单元格形状看起来是不是自然/平滑
我将使用以下Mathemaica脚本来验证结果:
image =// ImageData; palette = Union[Join @@ image]; Print["P = ", Length@palette]; grid = GridGraph[Reverse@Most@Dimensions@image]; image = Flatten[image /. Thread[palette -> Range@Length@palette]]; Print["N = ", Length@ConnectedComponents[ Graph[Cases[EdgeList[grid], m_ <-> n_ /; image[[m]] == image[[n]]]]]]
PHP100为您推荐与编程艺术有关的优秀文章:《优秀的程序员就像艺术家》,以及编程能用来做的更有意思的领域:《一个虚拟出来的编程空间》、《用HTML和CSS创建3D世界》、《HTML5技术秀:你的3D立体旋转名字》,希望编程能为你带来更多乐趣,编程原本就是另一种意义上的设计,编程理论上是万能的,这也是我当初钟爱编程的原因,其次,它能让我们做些自己想做的事,让生活更加简单、方便。这也是科技和艺术结合的魅力。
原文:Paint by Numbers
译文:http://www.php100.com/html/it/focus/2014/1209/8012.html
(翻译:PHP100_Alex)