matlab实现手绘风格(简笔画风格、漫画风格)的曲线绘图

  • matlab实现手绘风格(简笔画风格、漫画风格)的曲线绘图
    • 1 网站上的实现方法
    • 2 自己的实现方法

matlab实现手绘风格(简笔画风格、漫画风格)的曲线绘图

问题的起源是在国外网站的一些论坛上,为了绘出xkcd漫画风格的曲线,尝试用不同的绘图软件进行尝试。

下图为xkcd漫画中的一幅曲线插图。

比如在Create xkcd style diagram in TeX中,用TeX绘制这种曲线
https://tex.stackexchange.com/questions/74878/create-xkcd-style-diagram-in-tex
比如用python绘制曲线
https://stackoverflow.com/questions/29061729/gnuplot-how-to-mimic-sketch-graphs

还有利用matlab进行尝试的
https://stackoverflow.com/questions/12701841/xkcd-style-graphs-in-matlab

接下来对上面matlab网站的代码进行实现,并自己进行一些改进

1 网站上的实现方法

如果上外网比较慢,也可以在CSDN上也可以看到该方法的代码
https://blog.csdn.net/meatball1982/article/details/80536909
下面我对代码进行了分析和优化:
算法的思路如下:

1 绘制坐标轴,加粗
2 进行曲线绘制,加粗
3 对新叠加的曲线进行加白边的处理
4 添加手绘效果的字体
5 对整体图片进行随机扭动处理

优化的代码如下:

%定义曲线
x = 1:0.1:10;
y1 = sin(x).*exp(-x/3) + 3;
y2 = 3*exp(-(x-7).^2/2) + 1;%绘制曲线
fh = figure('color','w');
hold on
plot(x,y1,'b','lineWidth',3);
plot(x,y2,'w','lineWidth',7);
plot(x,y2,'r','lineWidth',3);
%设置坐标轴范围
xlim([0.95 10])
ylim([0 5])
%更改坐标轴字体
set(gca,'fontName','Comic Sans MS','fontSize',18,'lineWidth',3,'box','off')
%设置输出图片大小
set(fh,'Units','pixels','Position',[100 100 360 270])
%添加文字 annotation(fh,'textarrow',[0.3 0.45],[0.55 0.40],...'string',sprintf('text%shere',char(10)),'headStyle','none','lineWidth',2,...'fontName','Comic Sans MS','fontSize',14,'verticalAlignment','middle','horizontalAlignment','left')%保存原图并输入矩阵
saveas(gcf,'test.bmp');
close all
im=imread('test.bmp');%增加一点白边防止后面黑边
im = padarray(im,[15 15 0],255);%做随机扭动特效
sfc = size(im);
[yy,xx]=ndgrid(1:7:sfc(1),1:7:sfc(2));
pts = [xx(:),yy(:)];
tf = fitgeotrans(pts+2*randn(size(pts)),pts,'lwm',12);
w = warning;
warning off images:inv_lwm:cannotEvaluateTransfAtSomeOutputLocations
imt = imwarp(im,tf);
warning(w)%去除之前白边
imt = imt(16:end-15,16:end-15,:);
%绘图
figure('color','w')
imshow(imt)

这是输出未进行随机扭曲的图像

之后对原图像进行随机扭曲,得到下图类似水波纹的效果:

2 自己的实现方法

在之前方法的基础上加入了perlin噪声,使得曲线有更大尺度的震荡
原函数绘制如下:

去掉坐标轴,加入自己绘制的坐标轴,并加入较大尺度的柏林噪声,得到:

之后将图像整体进行扭曲

matlab的代码如下

%自己尝试的
%定义函数
x = 1:0.1:10;
y1 = sin(x).*exp(-x/3) + 3;
y2 = 3*exp(-(x-7).^2/2) + 1;
xlimtmat=[0.95 10];
ylimtmat=[0 5];%变化参数
D=0.03;%perlin噪声振幅
N=3;%perlin噪声密度
S=1.2;%波动特效
axislabel_x=2:2:8;
axislabel_y=0:2:5;%第一个图
fh1 = figure('color','w');
hold on
plot(x,y1,'b','lineWidth',3);
plot(x,y2,'r','lineWidth',3);
hold off
set(fh1,'Units','pixels','Position',[100 100 360 270])
saveas(gcf,'test1.bmp');
close all%第二个图
fh2 = figure('color','w');
hold on%坐标轴绘制
xaxis_x=linspace(xlimtmat(1),xlimtmat(end),101);
xaxis_y=linspace(ylimtmat(1), ylimtmat(1) ,101);
yaxis_x=linspace(xlimtmat(1), xlimtmat(1) ,101);
yaxis_y=linspace(ylimtmat(1),ylimtmat(end),101);
plot(xaxis_x,xaxis_y+randfun2(xaxis_x,N)*D*diff(ylimtmat),'k','lineWidth',3)%x轴
plot(yaxis_x+randfun2(yaxis_y,N)*D*diff(xlimtmat),yaxis_y,'k','lineWidth',3)%y轴%曲线绘制
yrand=randfun2(x,N)*D*diff(ylimtmat);
plot(x,y1+randfun2(x,N)*D*diff(ylimtmat),'b','lineWidth',3);
plot(x,y2+yrand,'w','lineWidth',7);
plot(x,y2+yrand,'r','lineWidth',3);
xlim([xlimtmat(1)-0.8*D*diff(xlimtmat),xlimtmat(end)])
ylim([ylimtmat(1)-0.8*D*diff(ylimtmat),ylimtmat(end)])
axis off%文字
annotation(fh2,'textarrow',[0.3 0.45],[0.55 0.40],...'string',sprintf('text%shere',char(10)),'headStyle','none','lineWidth',2,...'fontName','Comic Sans MS','fontSize',14,'verticalAlignment','middle','horizontalAlignment','left')
%坐标文字
stringcell_x=num2cell(axislabel_x);
stringcell_y=num2cell(axislabel_y);
text(axislabel_x,0*axislabel_x-diff(xlimtmat)*0.03,stringcell_x,'FontSize',14,'fontName','Comic Sans MS')
text(0*axislabel_y-diff(ylimtmat)*0,axislabel_y,stringcell_y,'FontSize',14,'fontName','Comic Sans MS')%,'HorizontalAlignment','right')hold off
set(fh2,'Units','pixels','Position',[100 100 360 270])%保存
saveas(gcf,'test2.bmp');
close all
%读取为矩阵
im=imread('test2.bmp');
%增加一点边防止后面黑边
im = padarray(im,[15 15 0],255);%做随机扭动特效
sfc = size(im);
[yy,xx]=ndgrid(1:7:sfc(1),1:7:sfc(2));
pts = [xx(:),yy(:)];
tf = fitgeotrans(pts+S*randn(size(pts)),pts,'lwm',12);
w = warning;
warning off images:inv_lwm:cannotEvaluateTransfAtSomeOutputLocations
imt = imwarp(im,tf);
warning(w)%去除之前白边
imt = imt(16:end-15,16:end-15,:);
%第三个图
fh3=figure('color','w');
imshow(imt)
set(fh3,'Units','pixels','Position',[100 100 360 270])
saveas(gcf,'test3.bmp');%生成随机曲线
function yr=randfun1(x,N)
%利用样条函数随机噪声,效果不好
yR=rand(1,N+2);
xR=x(1)+rand(1,N)*(x(end)-x(1));
xR=[x(1),xR,x(end)];
yr=interp1(xR,yR,x,'spline');
endfunction yr=randfun2(x,N)
%利用perlin噪声
%分配插值点
xP=(x-x(1))/(x(end)-x(1))*N;
%为插值点分配随机梯度
uxmat=rand(1,N+2)*2-1;
%设立空矩阵
zmat=0*xP;
for j=1:length(xP)%计算每个角点的点积%n0ddx=xP(j)-floor(xP(j));ux=uxmat(1,floor(xP(j))-0+1);n0=(ux*ddx);%n1ddx=xP(j)-floor(xP(j))-1;
%     if floor(xP(j))-0+2==12
%         xP
%     endux=uxmat(1,floor(xP(j))-0+2);n1=(ux*ddx);%6加权zmat(j)=lerp(n0,n1,xP(j)-floor(xP(j)));
end
yr=zmat/N*(x(end)-x(1))+x(1);
endfunction u=lerp(a,b,t)%权重相加tw=6*t.^5-15*t.^4+10*t.^3;%6*t.^5-15*t.^4+10*t.^3;%3*t.^2-2*t.^3;%u=(1-tw)*a + tw*b;
end

matlab实现手绘风格(简笔画风格、漫画风格)的曲线绘图相关推荐

  1. ps手机计算机图标教程,PS手机图标绘制教程:手绘时尚大方的扁平化风格手机APP图标。PS-站长资讯中心...

    PS手机图标绘制教程:手绘时尚大方的扁平化风格手机APP图标.初稿 步骤 02 制作时钟底盘 2.1 新建540*540px的圆,命名为[圆-1]并为其添加图层样式. 2.2 新建460*460px的 ...

  2. 手绘线条一直画不直_手绘板线条画不直怎么办?板绘画线诀窍分享

    在数位板画画和在纸上画画是有一定区别的,线条很难控制,手绘板线条画不直,那么如何在数位板上画出流畅线条?越是习惯手绘的朋友,那你可能就需要画更多的时间来适应数位板的画图方式,今天微课菌给大家分享一组板 ...

  3. 「精品」手绘游戏原画绘画学习的技巧

    手绘游戏原画绘画学习的技巧,其实画画是把眼睛能看到的东西,用手和可用的工具,用科学的光影的理解方式,把眼前三维视觉立体的物体,实现在二维平面的画面中!因此,最初评价一张画好坏的标准,就是眼前看到的三维 ...

  4. 手绘线条一直画不直_手绘板画出的斜直线不直,总是波浪线。

    展开全部 一  要不要练习板绘线条勾线?32313133353236313431303231363533e59b9ee7ad9431333431366239可以不练这个小技术吗? 勾线是板绘的基础,学 ...

  5. 手绘线条一直画不直_教程|手绘插画:学会画线就成功了一半(2)

    随着"视觉化"及Q版插画的大热,越来越多的小伙伴们希望学习手绘插画来表达自己的想法,图片+文字可以大大提高理解力和说服力,应用领域更是多种多样,如做读书笔记.会议记录.个人思想总结 ...

  6. 手绘线条一直画不直_视频教程 | 绘画小白福音,曲线画不准、直线画不直?来,我教你...

    曲线篇 曾几何时,画画的时候被一条条曲线折磨的死去活来 一条曲线描了又描.擦了又擦,纸都划破了还画不准 不论哪个地方的曲线,看到就头疼 如果一条曲线再加上透视,那可能就game over了 曲线真的很 ...

  7. echarts 在两点之间画一条线_树的手绘很难画?分步骤教你画,简单易学,收藏起来临摹学习...

    前景树--半树.角树画法 半树与角树,在建筑手绘中常处于前景位置,其表现需尽量写意,形体概括,对比强烈,进而更好地引导与突出中景. (1)半树 半树,顾名思义只需画出单棵树从树冠中下部到树根接地的位置 ...

  8. 手绘线条一直画不直_板绘画线手抖?线画不直?板绘练习画线技巧攻略!

    板绘画线手抖?线画不直?很多人画画都时先画草稿再线稿最后上色,所以线条就非常重要!但这对于刚接触手绘板的小伙伴不太友好,毕竟使用板绘跟使用纸和笔画画的差别还是蛮大的.因此,就会遇到连条流畅圆滑的线都画 ...

  9. 手绘线条一直画不直_什么?直线画不直?戳进来,你会满载而归!

    给零基础新手的入门系列教程:何天衢:[干货1]零基础小白学画画,到底应该从哪下手?​zhuanlan.zhihu.com 昨天,我分享了一篇关于线条的文章,今天我继续分享这一话题. 直线或多或少.或现 ...

最新文章

  1. Anchor Boxes示例实战
  2. 数据竞赛:如何小号作弊
  3. redux ngrx_另一个减少Redux(NGRX)应用程序样板的指南
  4. 文本分类实战技巧(tricks)汇总
  5. 技术人如何提升自己的核心竞争力
  6. 教育|施一公:研究生最重要的素质是什么?
  7. stylegan2-pytorch 自己训练的model 出错
  8. Zabbix(简介和ubuntu安装步骤)
  9. Pannellum:实例之自定义热点信息
  10. WIN10英文版改中文
  11. mysql 异步同步_MySQL主从复制异步半同步实例
  12. linux命令行sip电话,基于嵌入式Linux和MiniGUI的SIP电话设计
  13. 【金蝶K3Cloud】 Python套打插件开发记录
  14. [转载]RAR压缩包密码破解原理
  15. 贡献一个fisco-bcos-browser-front基于官方的代码改造的兼容手机浏览器和pc浏览器
  16. wpsa4排版_wps排版(wps如何一键排版)
  17. 慧数纵览:日产在华三大工厂将减产30,000辆
  18. LabVIEW编程LabVIEW开发 西门子
  19. 单基因gsea_10个细胞系仅1个表达你的基因
  20. Ubuntu 安装 php8.1

热门文章

  1. 小型微型计算机系统加急,小型微型计算机系统杂志
  2. 2022国赛数学建模思路 - 案例:集成算法AdaBoost
  3. 压力测试-Jmeter测试移动APP
  4. 一文读懂 select count(*) 底层原理
  5. 使用UE4制作简单的局域网对战小游戏
  6. 【华为OD机试-按身高和体重排队-Java】
  7. 外呼系统APP外呼软件手机电销软件拨号销售软件功能设计
  8. 关于图片转base64的加密解密
  9. Unity学习笔记(一):第三人称镜头和人物移动
  10. 如何理解结构化、非结构化和半结构化数据?