来源:恋习Python
本文约1300字,建议阅读7分钟。
本文先容图像处理的基本观点与事理,并手把手教你图片的手绘效果处理。
这几天,许多城市,迎来了2019年的第一场雪。
13日清晨,当北京市民拉开窗帘时创造,窗外雪花纷纭扬扬在空中飘落而且越下越大,树上、草地、屋顶、道路上...都落满雪花京城银装素裹,这是今冬以来北京迎来的第二场降雪一下雪,北京就变成了北平,故宫就变成了紫禁城八万张门票在雪花飘下来之前,便早已预订一空。
看着朋友圈、微博好友都在纷纭晒图,
不过,我们溘然想到,可以通过Python将故宫的建筑物图片,转化为手绘图(素描效果)。效果图如下:
一、观点与事理
我们都知道手绘图效果的特色紧张有:
黑白灰色;边界线条较重;相同或附近色彩趋于白色;略有光源效果。核心事理:利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变革来仿照人类视觉的仿照程度。
把图像算作二维离散函数,灰度梯度实在便是这个二维离散函数的求导,用差分代替微分,求取图像的灰度梯度。常用的一些灰度梯度模板有:Roberts 梯度、Sobel 梯度、Prewitt 梯度、Laplacian 梯度。
以Sobel梯度打算来阐明:
首先打算出
、
,然后打算梯度角
梯度方向及图像灰度增大的方向,个中梯度方向的梯度夹角大于平坦区域的梯度夹角。如下图所示,灰度值增加的方向梯度夹角大,此时梯度夹角大的方向为梯度方向。对应在图像中探求某一点的梯度方向即通过打算该点与其8邻域点的梯度角,梯度角最大即为梯度方向。
二、图像的数组形式与变换
个中,须要用到的方法:
Image.open( ): 打开图片np.array( ) : 将图像转化为数组convert(\"大众L\公众): 将图片转换成二维灰度图片Image.fromarray( ): 将数组还原成图像uint8格式代码如下:
from PIL import Imageimport numpy as npim = Image.open(r\公众C:\Users\Administrator\Desktop\gugong\微信图片_20190216152248.jpg\"大众).convert('L')a=np.asarray(im).astype('float')print(a.shape,a.dtype)(1080, 608) float64#(1080, 608)分别表示高度,宽度
三、图像的手绘效果处理
实现思路步骤:
梯度的重构布局guan光源效果梯度归一化图像天生1. 梯度的重构
numpy的梯度函数的先容:
np.gradient(a) : 打算数组a中元素的梯度,f为多维时,返回每个维度的梯度 离散梯度: xy坐标轴连续三个x轴坐标对应的y轴值:a, b, c 个中b的梯度是(c-a)/2 ,而c的梯度是: (c-b)/1当为二维数组时,np.gradient(a) 得出两个数组,第一个数组对应最外层维度的梯度,第二个数组对应第二层维度的梯度。
代码如下:
grad=np.gradient(a)grad_x,grad_y=gradgrad_x = grad_x depth / 100.#对grad_x值进行归一化grad_y = grad_y depth / 100.#对grad_y值进行归一化
2. 布局guan光源效果
设计一个位于图像斜上方的虚拟光源光源相对付图像的视角为Elevation,方位角为Azimuth建立光源对各点梯度值的影响函数运算出各点的新像素值个中:
np.cos(evc.el) : 单位光芒在地平面上的投射长度dx,dy,dz:光源对x,y,z三方向的影响程度3. 梯度归一化
布局x和y轴梯度的三维归一化单位坐标系;梯度与光源相互浸染,将梯度转化为灰度。4. 图像天生
详细详情代码如下:
from PIL import Imageimport numpy as npimport osimport joinimport timedef image(sta,end,depths=10): a = np.asarray(Image.open(sta).convert('L')).astype('float') depth = depths # 深度的取值范围(0-100),标准取10 grad = np.gradient(a) # 取图像灰度的梯度值 grad_x, grad_y = grad # 分别取横纵图像梯度值 grad_x = grad_x depth / 100.#对grad_x值进行归一化 grad_y = grad_y depth / 100.#对grad_y值进行归一化 A = np.sqrt(grad_x 2 + grad_y 2 + 1.) uni_x = grad_x / A uni_y = grad_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) # 光源对x 轴的影响 dy = np.cos(vec_el) np.sin(vec_az) # 光源对y 轴的影响 dz = np.sin(vec_el) # 光源对z 轴的影响 b = 255 (dx uni_x + dy uni_y + dz uni_z) # 光源归一化 b = b.clip(0, 255) im = Image.fromarray(b.astype('uint8')) # 重构图像 im.save(end)def main(): xs=10 start_time = time.clock() startss = os.listdir(r\"大众C:\Users\Administrator\Desktop\gugong\"大众) time.sleep(2) for starts in startss: start = ''.join(starts) sta = 'C:/Users/Administrator/Desktop/gugong/' + start end = 'C:/Users/Administrator/Desktop/gugong/' + 'HD_' + start image(sta=sta,end=end,depths=xs) end_time = time.clock() print('程序运行了 ----' + str(end_time - start_time) + ' 秒') time.sleep(3)main()程序运行了 ----43.01828205879955 秒 #一共35张图片
终极效果图比拟:
其他图片就不一一列举,若须要获取更多图片素材,后台回答“故宫雪景”即可得到;你也可以通过此代码为自己画一张手绘图;也可以为自己的家乡或母校画。
末了温馨提示:
人生苦短,我用Python;
除了生娃,啥都能干!
!
欢迎大家在留言处,留言自己曾经用Python做过哪些故意思的事!
参考资料
北京理工大学的嵩天老师的网络课程http://www.icourse163.org/learn/BIT-1001870002?tid=1001963001#/learn/announce编辑:黄继彦
校正:陈瑞清
— 完 —
关注清华-青岛数据科学研究院官方微信公众年夜众平台“THU数据派”及姊妹号“数据派THU”获取更多讲座福利及优质内容。