赞
踩
String Art是一种只利用钉子和线进行作画的一种艺术,通过线的稠密度来表现不同的图案。下图为艺术家Petros Vrellis的一副作品。
在2018年,一篇《String Art: Towards Computational Fabrication of String Images》的论文介绍了如何利用数学的方式,利用计算机辅助进行直线艺术的绘制。
文章中首先建立了像素画直线的模型,然后利用优化模型对每个节点处线的布置进行优化,得到期望的图像。
本博客仿照论文中的思想,自己编程尝试进行得到相似的结果。
首先将图片进行像素化,以便之后的定量计算。
直线的像素化采用的是:计算机图形学笔记-三种画线算法https://blog.csdn.net/Hnubama/article/details/50927006
这篇文章中的DDA方法。
采用随机布点的方式进行实验,最终呈现效果如下:
为了方便考虑重叠的情况,假设线越密集,该像素点的值越大(但不能超过某一个值)
%绘制直线算法 Ymax=100; Xmax=100; %画布XY为[0,0]到[Y,X]的0矩阵,格式为zeros(Y,X) XY=zeros(Ymax+1,Xmax+1);%创建画布 %创建点,格式为[pAx,pAy,pBx,pBy] N=30; pApB=zeros(N,4); for j=1:N pApB(j,:)=round([Xmax*rand(),Ymax*rand(),Xmax*rand(),Ymax*rand()]); end %进行随机直线绘画 for j=1:N XYi=zeros(Ymax+1,Xmax+1);%创建画布 [xi,yi]=drawline(pApB(j,:)); XYi(sub2ind(size(XYi),yi+1,xi+1))=0.5; XY=XY+XYi; end XY(XY>1)=1; pcolor(XY) function [xi,yi]=drawline(pApB) %在画布XY上给出直线的索引,所以pA和pB的范围不能超出画布 %pA,pB为2元素整数向量,如[11,31] pA=pApB(1:2); pB=pApB(3:4); dx=pB(1)-pA(1); dy=pB(2)-pA(2); if abs(dx)>=abs(dy) K=abs(dx); xi=round(linspace(pA(1),pB(1),K)); yi=round(linspace(pA(2),pB(2),K)); elseif abs(dx)<abs(dy) K=abs(dy); xi=round(linspace(pA(1),pB(1),K)); yi=round(linspace(pA(2),pB(2),K)); end end
对于一个圆形的钉子阵,对每个钉子从1到N进行编号,并假设每个钉子之间的连线最多只有1条。则最终线之间的连接方式可以用一个对称的矩阵表示,矩阵的数值只有0和1两种情况,1代表所对应的行号和列号的钉子之间存在连线,0则代表没有。
之后就可以利用矩阵的对称性,将三角矩阵展开成一个数组。此时二维问题被简化为1维问题。又由于该1维数组是二进制数组,作为优化的自变量,这个问题适合用ga(遗传算法)进行优化。
在已知该二进制数组的情况下,也可以反向推导出输出图像,如下图。
之后求出输出图像与原图像的残差,并认为目标函数的残差最小即为最佳优化。
此外由于边缘部分的一般不是很重要,所以对在写评价函数时,利用高斯函数,赋予中心较大的权重,赋予边缘较小的权重。
二进制ga算法采用的是Yarpiz的matlab程序,下载地址为
https://ww2.mathworks.cn/matlabcentral/fileexchange/52856-binary-and-real-coded-genetic-algorithms?requestedDomain=zh
首先实验已知解的情况。当目标图形为一个圆环时,对应的连线解为相邻连线的包络图形。
可以看到虽然输出图像在有限步的优化迭代中并没有达到最佳的解,但也相差不大,证明整体的思路方法时没有问题的。
之后尝试用真实的图片进行尝试。
模型用了100个固定钉子点,画布为200×200像素的画布。最终结果并不是很好。灰度图上基本相似,但是距原图的差距还很远(隔远了缩小看还是能大概看出来的)。
对比论文中的效果图,论文中用了超过200多个点,上千的像素画布进行计算,所以效果要好得多。下图为论文效果图的细节。
所以为了更好的还原图像,需要更高的像素的画布和更多的点。然而更大的画布与更多的点意味着更大的计算量,本文由于电脑计算量有限,所以难以展现更精致的图案。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。