当前位置:   article > 正文

String Art利用matlab用直线作画

string art

String Art利用matlab用直线作画

1简介

String Art是一种只利用钉子和线进行作画的一种艺术,通过线的稠密度来表现不同的图案。下图为艺术家Petros Vrellis的一副作品。

在这里插入图片描述
在2018年,一篇《String Art: Towards Computational Fabrication of String Images》的论文介绍了如何利用数学的方式,利用计算机辅助进行直线艺术的绘制。

文章中首先建立了像素画直线的模型,然后利用优化模型对每个节点处线的布置进行优化,得到期望的图像。
在这里插入图片描述
本博客仿照论文中的思想,自己编程尝试进行得到相似的结果。

2 直线模型的建立

首先将图片进行像素化,以便之后的定量计算。

直线的像素化采用的是:计算机图形学笔记-三种画线算法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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

3 优化方法

对于一个圆形的钉子阵,对每个钉子从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

4 结果

首先实验已知解的情况。当目标图形为一个圆环时,对应的连线解为相邻连线的包络图形。
在这里插入图片描述
可以看到虽然输出图像在有限步的优化迭代中并没有达到最佳的解,但也相差不大,证明整体的思路方法时没有问题的。

之后尝试用真实的图片进行尝试。
在这里插入图片描述
模型用了100个固定钉子点,画布为200×200像素的画布。最终结果并不是很好。灰度图上基本相似,但是距原图的差距还很远(隔远了缩小看还是能大概看出来的)。

对比论文中的效果图,论文中用了超过200多个点,上千的像素画布进行计算,所以效果要好得多。下图为论文效果图的细节。
在这里插入图片描述
所以为了更好的还原图像,需要更高的像素的画布和更多的点。然而更大的画布与更多的点意味着更大的计算量,本文由于电脑计算量有限,所以难以展现更精致的图案。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/96857
推荐阅读
相关标签
  

闽ICP备14008679号