numpy生成手绘图代码原理的一些解释
代码如下:
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生成手绘图代码原理的一些解释相关推荐
- 2019-04-07 Python之利用PIL改变图片颜色和生成手绘图
前:1.使用图片放在文件最后,需要的请自行下载 2.运行环境win10家庭版,已经安装好pillow库 一.学习总结 PIL库支持图像的储存,显示和处理,几乎能处理所有的图片格式,可以完成对图像的缩放 ...
- Python自动生成手绘、证件照、九宫格...太炫酷了(附零基础学习资料)
前言 python像是叮当猫的口袋,几乎什么都能做,适合外行小白们去摸索学习,能极大的增加对编程的兴趣.(文末送福利) 有些工具用python来实现不一定是技术上的最优选择,但可能是最简洁.最面向大众 ...
- Unity编译器 《策划表编表工具》 Excel转Json自动生成解析c#代码
Unity编译器 <策划表编表工具> Excel转Json自动生成解析c#代码 1.表格数据结构解释 2.Excel文件路径 3.C#代码与Json自动生成路径 点击下载依赖Dll程序集 ...
- 前端利器!让AI根据手绘原型生成HTML | 教程+代码
王小新 编译自 Insight Data Blog 量子位 出品 | 公众号 QbitAI 写个网页能有多麻烦?在大多数公司里,这项工作分为三步: 1. 产品经理完成用户调研任务后,列出一系列技术要求 ...
- 【数字IC手撕代码】Verilog伪随机数生成器|线性反馈移位寄存器|题目|原理|设计|仿真
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- c++ 模板类实现堆栈实验报告_编译原理——小型类C编译器的设计和实现(生成8086汇编代码)之1:问题定义以及总体功能...
前面花了两篇文章来介绍词法分析和语法分析,接下来才是比较有意思的部分--一个小型类C编译器的设计和实现(其实是编译原理的课程设计啦!~)我用的是python2.7.13+PyQt来做的...事实上,正 ...
- 【数字IC手撕代码】Verilog奇数分频|题目|原理|设计|仿真(三分频,五分频,奇数分频及特殊占空比)
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- 【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- 高斯朴素贝叶斯分类的原理解释和手写代码实现
来源:DeepHub IMBA 本文约3500字,建议阅读10+分钟 本文与你介绍高斯分布的基本概念及代码实现. Gaussian Naive Bayes (GNB) 是一种基于概率方法和高斯分布的机 ...
最新文章
- linux 查看软连接_linux删除原理
- 转载:缓存 Cache
- Web开发系列 - JSON
- 关于intent传递数据的练习
- AndroidStudio工具将Module项目导出成Jar和arr库
- 第八十四期: Java、Web 和移动程序员学习的 12 个框架
- 一调计算机专业综合理论试卷,一调计算机专业综合理论试卷(盐城)(新编)
- Android Palette颜色提取
- linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)
- 【javascript】关于react的Virtual DOM 与数据更新
- mysql order by if函数_mysql order by
- 直播平台软件开发的全流程探索
- c++程序查重系统设计思路
- Altium designer学习(三)贴片元器件的选择——贴片电阻篇
- oracle 常见报错
- Redis数据结构:快速的Redis有哪些慢操作?
- request_threaded_irq()参数
- 在阿里我是如何当面试官的
- python画图时,中文无法正常显示的问题,RuntimeWarning: Glyph 26631 missing from current font. font.set_text(s, 0, fl
- 使用递归函数计算1到n之和