代码如下:

from PIL import Image
import numpy as np
#主要实现一下四点
#1)手绘图是灰度图像
#2)手绘图的边界线条比较重
#3)相同或相近色彩趋于白色
#4)模仿实际照片中的光源效果a = np.array(Image.open('./image/故宫.png').convert('L')).astype('float')
#convert('L')——将RGB图片转化为灰度图片(灰度图像是指图片中只有黑色、白色和各种不同深度的灰度,其中0代表黑,255代表白)grad = np.gradient(a)   #取图像灰度的梯度值,a是二维数组,所以梯度值有x,y两个方向的
gradx, grady = grad     #分别取横纵图像梯度值,梯度代表图像在xy轴上的颜色变化趋势depth = 10
gradx = gradx * depth/100.
grady = grady * depth/100.#将gradx,grady与1进行单位化
A = np.sqrt(gradx**2 + grady**2 +1.)
uni_x = abs(gradx) / A
uni_y = abs(grady) / A
uni_z=1./A#光源效果
vec_el = np.pi / 2.2    #光源的俯视角度,弧度值
vec_az = np.pi / 4.     #光源的方位角度,弧度值
print(vec_az,vec_el)
dx = np.cos(vec_el) * np.cos(vec_az)    #光源在x轴的位置
dy = np.cos(vec_el) * np.sin(vec_az)    #光源在y轴的位置
dz = np.sin(vec_el)           #光源在z轴的位置,这里我们把dx、dy、dz视为光源对图像的影响程度b = 255 * (dx * uni_x + dy * uni_y+dz*uni_z )  #光源归一化
b = b.clip(0, 255)     #剪切,对溢出值进行处理
im = Image.fromarray(b.astype('uint8'))   #重构图像
im.show()

效果图

        

大家注意对比两个图片的区别,网上常见的解释如下

#1)手绘图是灰度图像
#2)手绘图的边界线条比较重
#3)相同或相近色彩趋于白色
#4)模仿实际照片中的光源效果

灰度图像就不解释了,重点在2和3。以下是需要知道的:

1、图像颜色变化的幅度可以用梯度表示。

2、手绘图中颜色比较深的部分往往是物体的边界(手绘图中的线条),而原图中物体的边界部分颜色变化非常大(梯度绝对值很大)。

3、原图中颜色变化不大的区域(梯度绝对值很小)在手绘图中是浅色乃至白色。

4、灰度图像0代表黑色,255代表白色,中间则代表不同深度的灰色。

根据上面的知识我们可以推理出如下关系:

1)原图中某点处,梯度绝对值越大,对应手绘图中的点灰度值越小(越黑)

2)原图中某点处,梯度绝对值越小,对应手绘图中的点灰度值越大(越白)

于是手绘图的灰度值就与原图的梯度有一个反比例的关系。

分析下代码:

a = np.array(Image.open('./image/故宫.png').convert('L')).astype('float')grad = np.gradient(a)   #取图像灰度的梯度值,a是二维数组,所以梯度值有x,y两个方向的
gradx, grady = grad     #分别取横纵图像梯度值,梯度代表图像在xy轴上的颜色变化趋势

这里是先把原图转化为灰度图像,再求梯度。

depth = 10
gradx = gradx * depth/100.
grady = grady * depth/100.A = np.sqrt(gradx**2 + grady**2 +1.)
uni_x = abs(gradx) / A
uni_y = abs(grady) / A
uni_z=1./A
#光源效果
vec_el = np.pi / 2.2    #光源的俯视角度,弧度值
vec_az = np.pi / 4.     #光源的方位角度,弧度值
print(vec_az,vec_el)
dx = np.cos(vec_el) * np.cos(vec_az)    #光源在x轴的位置
dy = np.cos(vec_el) * np.sin(vec_az)    #光源在y轴的位置
dz = np.sin(vec_el)           #光源在z轴的位置,这里我们把dx、dy、dz视为光源对图像的影响程度b = 255 * (dx * uni_x + dy * uni_y+dz*uni_z )  #光源归一化

这段代码构造出一个梯度gradx、grady与b的函数。输出这个函数的图像

可以看出这不仅是个反比例函数,而且还是个两极化的反比例函数,这是为了让手绘图的线条和空白的对比度更高。

因此gradx、grady的单位化和光源效果只是为了构建一个这样的反比例函数。

输出函数图像的代码如下:

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import pyplot as pltfig = plt.figure()
ax = Axes3D(fig)
x = np.arange(0,2*np.pi,0.1)
y = np.arange(0,2*np.pi,0.1)X, Y = np.meshgrid(x, y)  # [important] 创建网格 np.meshgrid(xnums,ynums)
A = np.sqrt(X**2 + Y**2 +1.)
uni_x = abs(X) / A
uni_y = abs(Y) / A
uni_z=1./A
# 光源效果
vec_el = np.pi / 2.2
vec_az = np.pi / 4.
dx = np.cos(vec_el) * np.cos(vec_az)
dy = np.cos(vec_el) * np.sin(vec_az)
dz = np.sin(vec_el)Z = dx * uni_x + dy * uni_y+dz*uni_z;plt.xlabel('x')
plt.ylabel('y')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
plt.show()

numpy生成手绘图代码原理的一些解释相关推荐

  1. 2019-04-07 Python之利用PIL改变图片颜色和生成手绘图

    前:1.使用图片放在文件最后,需要的请自行下载 2.运行环境win10家庭版,已经安装好pillow库 一.学习总结 PIL库支持图像的储存,显示和处理,几乎能处理所有的图片格式,可以完成对图像的缩放 ...

  2. Python自动生成手绘、证件照、九宫格...太炫酷了(附零基础学习资料)

    前言 python像是叮当猫的口袋,几乎什么都能做,适合外行小白们去摸索学习,能极大的增加对编程的兴趣.(文末送福利) 有些工具用python来实现不一定是技术上的最优选择,但可能是最简洁.最面向大众 ...

  3. Unity编译器 《策划表编表工具》 Excel转Json自动生成解析c#代码

    Unity编译器 <策划表编表工具> Excel转Json自动生成解析c#代码 1.表格数据结构解释 2.Excel文件路径 3.C#代码与Json自动生成路径 点击下载依赖Dll程序集 ...

  4. 前端利器!让AI根据手绘原型生成HTML | 教程+代码

    王小新 编译自 Insight Data Blog 量子位 出品 | 公众号 QbitAI 写个网页能有多麻烦?在大多数公司里,这项工作分为三步: 1. 产品经理完成用户调研任务后,列出一系列技术要求 ...

  5. 【数字IC手撕代码】Verilog伪随机数生成器|线性反馈移位寄存器|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  6. c++ 模板类实现堆栈实验报告_编译原理——小型类C编译器的设计和实现(生成8086汇编代码)之1:问题定义以及总体功能...

    前面花了两篇文章来介绍词法分析和语法分析,接下来才是比较有意思的部分--一个小型类C编译器的设计和实现(其实是编译原理的课程设计啦!~)我用的是python2.7.13+PyQt来做的...事实上,正 ...

  7. 【数字IC手撕代码】Verilog奇数分频|题目|原理|设计|仿真(三分频,五分频,奇数分频及特殊占空比)

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  8. 【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  9. 高斯朴素贝叶斯分类的原理解释和手写代码实现

    来源:DeepHub IMBA 本文约3500字,建议阅读10+分钟 本文与你介绍高斯分布的基本概念及代码实现. Gaussian Naive Bayes (GNB) 是一种基于概率方法和高斯分布的机 ...

最新文章

  1. linux 查看软连接_linux删除原理
  2. 转载:缓存 Cache
  3. Web开发系列 - JSON
  4. 关于intent传递数据的练习
  5. AndroidStudio工具将Module项目导出成Jar和arr库
  6. 第八十四期: Java、Web 和移动程序员学习的 12 个框架
  7. 一调计算机专业综合理论试卷,一调计算机专业综合理论试卷(盐城)(新编)
  8. Android Palette颜色提取
  9. linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)
  10. 【javascript】关于react的Virtual DOM 与数据更新
  11. mysql order by if函数_mysql order by
  12. 直播平台软件开发的全流程探索
  13. c++程序查重系统设计思路
  14. Altium designer学习(三)贴片元器件的选择——贴片电阻篇
  15. oracle 常见报错
  16. Redis数据结构:快速的Redis有哪些慢操作?
  17. request_threaded_irq()参数
  18. 在阿里我是如何当面试官的
  19. python画图时,中文无法正常显示的问题,RuntimeWarning: Glyph 26631 missing from current font. font.set_text(s, 0, fl
  20. 使用递归函数计算1到n之和

热门文章

  1. C#:实现DFA算法(附完整源码)
  2. android手机是怎么计算爬楼,抖音爬楼Climber
  3. MySQL版本区别及选择
  4. 周记:ajax获取后台数据
  5. C语言中bool类型的使用
  6. 甲骨文华育兴业|兰州理工大学理学院举办“化简为繁的大数据”学术交流会
  7. 2022-2027年中国数码印花墨水行业市场全景评估及发展战略规划报告
  8. IC front-end design engineer
  9. 去除打开WORD时出现的.tmp文件
  10. 2022-2028全球与中国紧急广播系统市场现状及未来发展趋势