• 为艺术而生的素描提取器
大家好，我是 Jack。

小时候，我其实还是有点艺术细胞的，喜欢看火影忍者和七龙珠的我，虽然没学过绘画，但也笨手笨脚地画了不少作品。

特意叫我妈，把我收藏多年的小破本拿出来，分享下我儿时的快乐。

小学几年级画的记不清了，只记得一画就是小半天，还拿去学校显摆了一番。

如今，再让我拿起铅笔，画个素描，我是画不出来了。

不过，我另辟蹊径，用起了算法。我lbw，没有开挂！

Anime2Sketch

Anime2Sketch 是一个动画、漫画、插画等艺术作品的素描提取器。

给我个艺术作品，我直接把它变成素描作品：

耗时1秒临摹的素描作品：

Anime2Sketch 算法也非常简单，就是一个 UNet 结构，生成素描作品，可以看下它的网络结构：

import torch
import torch.nn as nn
import functools

class UnetGenerator(nn.Module):
"""Create a Unet-based generator"""

def __init__(self, input_nc, output_nc, num_downs, ngf=64, norm_layer=nn.BatchNorm2d, use_dropout=False):
"""Construct a Unet generator
Parameters:
input_nc (int)  -- the number of channels in input images
output_nc (int) -- the number of channels in output images
num_downs (int) -- the number of downsamplings in UNet. For example, # if |num_downs| == 7,
image of size 128x128 will become of size 1x1 # at the bottleneck
ngf (int)       -- the number of filters in the last conv layer
norm_layer      -- normalization layer
We construct the U-Net from the innermost layer to the outermost layer.
It is a recursive process.
"""
super(UnetGenerator, self).__init__()
# construct unet structure
unet_block = UnetSkipConnectionBlock(ngf * 8, ngf * 8, input_nc=None, submodule=None, norm_layer=norm_layer, innermost=True)  # add the innermost layer
for _ in range(num_downs - 5):          # add intermediate layers with ngf * 8 filters
unet_block = UnetSkipConnectionBlock(ngf * 8, ngf * 8, input_nc=None, submodule=unet_block, norm_layer=norm_layer, use_dropout=use_dropout)
# gradually reduce the number of filters from ngf * 8 to ngf
unet_block = UnetSkipConnectionBlock(ngf * 4, ngf * 8, input_nc=None, submodule=unet_block, norm_layer=norm_layer)
unet_block = UnetSkipConnectionBlock(ngf * 2, ngf * 4, input_nc=None, submodule=unet_block, norm_layer=norm_layer)
unet_block = UnetSkipConnectionBlock(ngf, ngf * 2, input_nc=None, submodule=unet_block, norm_layer=norm_layer)
self.model = UnetSkipConnectionBlock(output_nc, ngf, input_nc=input_nc, submodule=unet_block, outermost=True, norm_layer=norm_layer)  # add the outermost layer

def forward(self, input):
"""Standard forward"""
return self.model(input)

class UnetSkipConnectionBlock(nn.Module):
"""Defines the Unet submodule with skip connection.
X -------------------identity----------------------
|-- downsampling -- |submodule| -- upsampling --|
"""

def __init__(self, outer_nc, inner_nc, input_nc=None,
submodule=None, outermost=False, innermost=False, norm_layer=nn.BatchNorm2d, use_dropout=False):
"""Construct a Unet submodule with skip connections.
Parameters:
outer_nc (int) -- the number of filters in the outer conv layer
inner_nc (int) -- the number of filters in the inner conv layer
input_nc (int) -- the number of channels in input images/features
submodule (UnetSkipConnectionBlock) -- previously defined submodules
outermost (bool)    -- if this module is the outermost module
innermost (bool)    -- if this module is the innermost module
norm_layer          -- normalization layer
use_dropout (bool)  -- if use dropout layers.
"""
super(UnetSkipConnectionBlock, self).__init__()
self.outermost = outermost
if type(norm_layer) == functools.partial:
use_bias = norm_layer.func == nn.InstanceNorm2d
else:
use_bias = norm_layer == nn.InstanceNorm2d
if input_nc is None:
input_nc = outer_nc
downconv = nn.Conv2d(input_nc, inner_nc, kernel_size=4,
downrelu = nn.LeakyReLU(0.2, True)
downnorm = norm_layer(inner_nc)
uprelu = nn.ReLU(True)
upnorm = norm_layer(outer_nc)

if outermost:
upconv = nn.ConvTranspose2d(inner_nc * 2, outer_nc,
kernel_size=4, stride=2,
down = [downconv]
up = [uprelu, upconv, nn.Tanh()]
model = down + [submodule] + up
elif innermost:
upconv = nn.ConvTranspose2d(inner_nc, outer_nc,
kernel_size=4, stride=2,
down = [downrelu, downconv]
up = [uprelu, upconv, upnorm]
model = down + up
else:
upconv = nn.ConvTranspose2d(inner_nc * 2, outer_nc,
kernel_size=4, stride=2,
down = [downrelu, downconv, downnorm]
up = [uprelu, upconv, upnorm]

if use_dropout:
model = down + [submodule] + up + [nn.Dropout(0.5)]
else:
model = down + [submodule] + up

self.model = nn.Sequential(*model)

def forward(self, x):
if self.outermost:
return self.model(x)

def create_model(gpu_ids=[]):
"""Create a model for anime2sketch
hardcoding the options for simplicity
"""
norm_layer = functools.partial(nn.InstanceNorm2d, affine=False, track_running_stats=False)
net = UnetGenerator(3, 1, 8, 64, norm_layer=norm_layer, use_dropout=False)
for key in list(ckpt.keys()):
if 'module.' in key:
ckpt[key.replace('module.', '')] = ckpt[key]
del ckpt[key]
if len(gpu_ids) > 0:
assert(torch.cuda.is_available())
net.to(gpu_ids[0])
net = torch.nn.DataParallel(net, gpu_ids)  # multi-GPUs
return net

UNet 应该都很熟悉了，就不多介绍了。

项目地址：https://github.com/Mukosame/Anime2Sketch

环境部署也很简单，只需要安装以下三个库：

torch>=0.4.1
torchvision>=0.2.1
Pillow>=6.0.0


然后下载权重文件，即可。

直接下载，即可运行（提取码：a7r4）：

https://pan.baidu.com/s/1h6bqgphqUUjj4fz61Y9HCA

进入项目根目录，直接运行命令：

python3 test.py --dataroot test_samples --load_size 512 --output_dir results


运行效果：

“画”得非常快，我在网上找了一些图片进行测试。

鸣人和带土：

柯南和灰原哀：

絮叨

使用算法前：

这样的素描，没有灵魂！

使用算法后：

拿了一些真人的图片进行了测试，发现效果很差，果然真人的线条还是要复杂一些的。

最后再送大家一本，帮助我拿到 BAT 等一线大厂 offer 的数据结构刷题笔记，是一位 Google 大神写的，对于算法薄弱或者需要提高的同学都十分受用（提起码：m19c）：

BAT 大佬分类总结的 Leetcode 刷题模版，助你搞定 90% 的面试

以及我整理的 BAT 算法工程师学习路线，书籍+视频，完整的学习路线和说明，对于想成为算法工程师的，绝对能有所帮助（提取码：jack）：

我是如何成为算法工程师的，超详细的学习路线

我是 Jack，我们下期见。

展开全文
•   1. 用python做数字油画 模块： pillow   2. 从一幅画学习风格，去画另一幅画 http://pytorch.org/tutorials/advanced/neural_style_tutorial.html


1. 用python做数字油画
模块： pillow

2. 从一幅画学习风格，去画另一幅画


展开全文
• python使用数据画一幅画 使用网站https://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt对黑子预测的数据作出一幅图表，并输出为PDF，使用的环境为python3.6 源代码如下： import urllib....
python使用数据画一幅画
源代码如下：
import urllib.request
from urllib.request import urlopen
from reportlab.graphics.shapes import *
from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.charts.textlabels import Label
from reportlab.graphics import renderPDF

COMMENT_CHARS='#:'

drawing=Drawing(400,200)
data=[]
line=line.decode()
if not line.isspace() and not line[0] in COMMENT_CHARS:
data.append([float(n) for n in line.split()])

pred=[row[2] for row in data]
high=[row[3] for row in data]
low=[row[4] for row in data]
times=[row[0]+row[1]/12.0 for row in data]
lp=LinePlot()
lp.x=50
lp.y=50
lp.height=125
lp.width=300
lp.data=[tuple(zip(times,pred)),tuple(zip(times,high)),tuple(zip(times,low))]
lp.lines[0].strokeColor=colors.blue
lp.lines[1].strokeColor=colors.red
lp.lines[2].strokeColor=colors.green

renderPDF.drawToFile(drawing,'report3.pdf','Sunspots')

与python2中还是有一些语句不同的。
引用如下：

https://blog.csdn.net/jtscript/article/details/44357479


展开全文
• 一文教你如何用turtle【樱花树】+【爱心】，还有【樱花树+爱心】合体版。不一样的【樱花树+爱心】送给不一样的你，520！「可以拿去送给自己喜欢的人」【白嫖代码哦】，快点点进来看看吧！！！

Author：AXYZdong 自动化专业 工科男
有一点思考，有一点想法，有一点理性！
定个小小目标，努力成为习惯！在最美的年华遇见更好的自己！
CSDN@AXYZdong，CSDN首发，AXYZdong原创
唯一博客更新的地址为： 👉 AXYZdong的博客 👈

文章目录前言一、樱花树二、爱心三、添加文字四、樱花树+爱心+文字总结
前言

灵感来源 或者说 什么促使了我写这篇文章 ：

520是一个独特的一个日子
之前用了Turtle库画了爱心，然后又参照一些大佬的文章，画了樱花树。
想把【樱花树+爱心】这两者结合起来，做一个小礼物送给不一样的你！

话说作为单身狗为啥要写这篇文章 ？ emmm ，你就当是白嫖喽

一、樱花树
关于樱花树，CSDN上面好多大佬都已经将代码开源，我只是一个搬运工，参考大佬的代码！

代码

import turtle as T
import random
import time

# 画樱花的躯干(60,t)
def Tree(branch, t):
time.sleep(0.0005)
if branch > 3:
if 8 <= branch <= 12:
if random.randint(0, 2) == 0:
t.color('snow')  # 白
else:
t.color('lightcoral')  # 淡珊瑚色
t.pensize(branch / 3)
elif branch < 8:
if random.randint(0, 1) == 0:
t.color('snow')
else:
t.color('lightcoral')  # 淡珊瑚色
t.pensize(branch / 2)
else:
t.color('sienna')  # 赭(zhě)色
t.pensize(branch / 10)  # 6
t.forward(branch)
a = 1.5 * random.random()
t.right(20 * a)
b = 1.5 * random.random()
Tree(branch - 10 * b, t)
t.left(40 * a)
Tree(branch - 10 * b, t)
t.right(20 * a)
t.up()
t.backward(branch)
t.down()

# 掉落的花瓣
def Petal(m, t):
for i in range(m):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
t.color('lightcoral')  # 淡珊瑚色
t.circle(1)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
# 绘图区域
t = T.Turtle()
# 画布大小
w = T.Screen()
t.hideturtle()  # 隐藏画笔
t.getscreen().tracer(5, 0)
w.screensize(1000,800,'wheat')  # wheat小麦
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')

# 画樱花的躯干
Tree(60, t)
# 掉落的花瓣
Petal(300, t)
w.exitonclick()


效果

二、爱心

代码

from turtle import *

penup()
goto(-100,-100)
pensize(4)
color('pink','pink')

left(90)
forward(100)
pendown()
begin_fill()
circle(70,230)
forward(140)
end_fill()

begin_fill()
seth(40)
forward(135)
right(5)
circle(70,235)
end_fill()

penup()
goto(100,-100)
pencolor('black')
write("By AXYZdong", font=('方正行黑简体', 30, 'normal'))

hideturtle()
mainloop()


效果

关于画爱心谈谈自我的感受：

对于坐标和各种角度转换可能需要思考一下，要让小乌龟知道你想让它干什么
turtle up 和 turtle down 注意使用的时机
turtle write 写文本时，使用电脑里已有的字体

三、添加文字
def Font():
t.penup()
t.goto(-500,-300)
t.pencolor('black')
t.write("By AXYZdong,不一样的樱花+爱心送给不一样的你，520", font=('方正行黑简体', 30, 'normal'))

四、樱花树+爱心+文字

完整代码，亲测可用

# =============================================
# --*-- coding: utf-8 --*--
# @Time    : 2020-05-20
# @Author  : AXYZdong
# @CSDN    : https://blog.csdn.net/qq_43328313
# @FileName: 520.py
# @Software: Python3.7
# =============================================
import turtle as T
import random
import time

# 画樱花的躯干(60,t)
def Tree(branch, t):
time.sleep(0.0005)
if branch > 3:
if 8 <= branch <= 12:
if random.randint(0, 2) == 0:
t.color('snow')  # 白
else:
t.color('lightcoral')  # 淡珊瑚色
t.pensize(branch / 3)
elif branch < 8:
if random.randint(0, 1) == 0:
t.color('snow')
else:
t.color('lightcoral')  # 淡珊瑚色
t.pensize(branch / 2)
else:
t.color('sienna')  # 赭(zhě)色
t.pensize(branch / 10)  # 6
t.forward(branch)
a = 1.5 * random.random()
t.right(20 * a)
b = 1.5 * random.random()
Tree(branch - 10 * b, t)
t.left(40 * a)
Tree(branch - 10 * b, t)
t.right(20 * a)
t.up()
t.backward(branch)
t.down()

# 掉落的花瓣
def Petal(m, t):
for i in range(m):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
t.color('lightcoral')  # 淡珊瑚色
t.circle(1)
t.up()
t.backward(a)
t.right(90)
t.backward(b)

# 爱心
def Love(x ,y):
t.up()
t.home()
t.goto(x,y)
t.pensize(4)
t.color('pink','pink')  # 粉
t.left(90)
t.forward(100)
t.down()
t.begin_fill()
t.circle(70,230)
t.forward(140)
t.end_fill()
t.begin_fill()
t.seth(40)
t.forward(135)
t.right(5)
t.circle(70,235)
t.end_fill()
t.up()

# 文字
def Font():
t.penup()
t.goto(-500,-300)
t.pencolor('black')
t.write("By AXYZdong,不一样的樱花+爱心送给不一样的你，520", font=('方正行黑简体', 30, 'normal'))

# 绘图区域
t = T.Turtle()
# 画布大小
w = T.Screen()
t.hideturtle()  # 隐藏画笔
t.getscreen().tracer(5, 0)
w.screensize(1000,800,'wheat')  # wheat小麦
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')

# 画樱花的躯干
Tree(60, t)
# 掉落的花瓣
Petal(300, t)
# 爱心
Love(-400, 100)
Love(400, 100)
Love(-400,-150)
Love(400,-150)
# 文字
Font()

w.exitonclick()


效果

也可以画点小圆圈装饰一下,灵感来源于 @1_bit 大佬

# 装饰画布
def Decorate(m):
x,y=-900,-400
for i in range(30):
t.up()
t.goto(x,y)
x+=100
t.down()
yval=50
for i in range(m):
a = 100*random.random()
b = 2*random.random()
if a>59:
t.color('#FE2E9A')
else:
t.color('#04B486')
t.circle(5)
t.up()
t.goto(x,y+(yval*b))
t.fd(a)
yval+=50
t.down()

装饰完了后就是文章开头的那个样子啦 ！
总结
独特的日期 + 创作的灵感 ，产生不一样的的火花。不一样的【樱花树+爱心】送给不一样的你，520 ！
看完这篇文章之后，告诉你一个坏消息：
博主可能要停更一段时间，毕竟期末考试它要来了，emmm，下一篇博客更精彩！

「你可能还想看」系列文章：
小白如何入门Python？记我的Python初体验
揭开「pip不是内部或外部命令，也不是可运行的程序或批处理文件」的神秘面纱
【Python数据可视化】超星学习通助手后台数据的可视化处理
【Python制作词云】分析QQ群聊信息，记录词频并制作词云
【Python制作词云】改变词云字体颜色
【Python】给PDF添加水印
「情人节快到了」“码”出礼物，一片“芯”意

看完就赞，养成习惯，尊重别人的劳动是一种美德！！！^ _ ^ ❤️ ❤️ ❤️
码字不易，大家的支持就是我坚持下去的动力。点赞后不要忘了👉关注👈我哦！
更多精彩内容请前往 AXYZdong的博客
如果以上内容有任何错误或者不准确的地方，欢迎在下面👇留个言。或者你有更好的想法，欢迎一起交流学习~~~


展开全文
• 写程序犹如创作一幅动画一般有趣，都知道动画其实由一幅幅静态连续播放形成的，程序中让一个控件拥有智能的人机交互由一连串的命令 集合来实现，一个命令犹如一幅静态一般，命令集合的连续执行犹如连续播放一般...
• ## 用字拼成一幅画

千次阅读 2020-02-15 16:04:40
#首先使用pillow.Image读取图像，并使用load函数获取到每个像素值 img_raw = Image . open ( img_path ) img_array = img_raw . load ( ) #然后新建一张画布，并选好要使用的字体和字体大小 img_new = ...
• 今天网上冲浪，无意间看到一幅讲解Linux内核的漫画，觉得很有意思，拿出来给大家分享一下。
• source:http://www.iot101.com/dghgyw/2016-06-23/11745.html一幅漫画告诉你：除了WiFi，蓝牙，最近火爆的NB-IoT能干嘛？iot101君编辑整理 2016-06-23 10:13:57 来源:wifiNB-IoT蓝牙漫画大家都知道WiFi（能上网），...
• 使用python调用本地画图框，自动完成绘图图像内容，自己看吧哈哈#coding=utf-8 import turtle as t t.pensize(4) t.hideturtle() t.colormode(255) t.color((255,155,192),"pink") ...
• Kevin Fjelsted是个盲人，他曾写了篇文章《A Brief History of the Accessibility of Computers by Blind People》，收录在《Amplifying Your Effectiveness》书中。文中从个盲人的视角描述了几十年来计算机...
• screen.width*0.7) {this.resized=true;...}" border=0>关于这灵图，有个相当可怖的说法，据说这是东南亚某国的个美丽女子，因为发现丈夫在外面偷情于是很伤心很绝望，因为她很爱他的丈夫。最后这个脆弱的女人绝
• 为什么是Python 先来聊聊为什么做数据分析一定要用Python或R语言。... ...Python这门语言诞生也相当之早，它的第个版本是26年前发表的，曾经（或者说当前）也被用于web开发，但是就流行程度来说...
• ggplot2在一幅图上两条曲线 print(data)后的结果是 C BROWN.P MI.P 0 0.9216 0.9282 30 0.9240 0.9282 100 0.9255 0.9282 现想要在一张图中两条曲线。横轴为C，纵轴分别为BROWN.P和MI.P，如何做？ 其实很简单...
• 方法：cv2画框 import numpy as np import os,cv2 im_file = os.path.join('E:\测试视频01', 'frame1.jpg') im = cv2.imdecode(np.fromfile(im_file, dtype=np.uint8), -1) class_name = 'people' dets = [ ...
• 老师让我们画一幅鱼在水中游动的图，完成了之后我又tianjia
• plt.subplot(4, 1, 1) ax1.yaxis.set_major_locator(MultipleLocator(15)) # 设定y轴刻度间距 #第条线 x = range(0, len(y0)) plt.plot(x, y0, color='black', label='$DT$', linewidth=0.8) # 绘制，指定颜色、...
• ## 在ARCGIS中画一幅高程地图、地形图

万次阅读 多人点赞 2018-12-18 23:40:10
、剪切目标区域地形图、设置适当色带达到目标效果 二、在目标区域中加上政区图 3设置显示经纬度、网格、并将经纬度设置成英文显示 4添加站点信息 最近发现这个网站有关于ARCGIS的不错的教程 怎么添加图例 ...
• ## Python每日一练(7)-图片转字符画

千次阅读 多人点赞 2020-04-06 19:05:03
字符画是一系列字符组合成的文本，看起来就像一幅画一样，如图1所示。如果我们要手写一个字符画，首先要有扎实的美术基础，其次还要花费大量的时间和精力。对于零基础小白而言，困难可想而知。 但是不要发愁，我们...
• 使用p5.js画一幅简单的动态风车图 因为大三互动媒体技术课程需要使用p5.js画图显示动态效果，并和自己手绘作品进行对比，查了查网上好像没有做风车相关的教程，就在这里简单介绍下吧。 工具 js编辑器(我用的是...
• 原文地址：给大家个非常好用的matlab程序(个figure中图，colormap如何设置)作者：CrazyMatrixfunction freezeColors(varargin) % freezeColors Lock colors of plot, enabling multiple colormaps per ...
• 因项目需要，将图片的部分送入神经网络进行检测，因此需要外扩边框为神经网络需要的图片大小，可以用画图打开原始图片查看像素边框的灰度值，故此记录之。。
• 解决一些问题 ...2、将该图存为一个模板，并使用该模板绘制一幅新的plot。   同时选中top和right的方法是，摁住Ctrl键，一次点击top和left即可同时选中，还有其他的框框出来一般都是右键或者双击。...
•  // 直方图  for( i = 0; i ; i++ )  {  double val = ( cvGetReal1D(hist->bins,i)*histimg->height/255 );  CvScalar color = CV_RGB(255,255,0); //(hsv2rgb(i*180.f/hdims);  ...

...