谁说程序员不懂艺术与浪漫?(Python素描画:征服你)
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁说程序员不懂艺术与浪漫?(Python素描画:征服你)相关的知识,希望对你有一定的参考价值。
程序员给人的印象总是:标准的理工男,直男,满眼都是code。
说的可能就是我(* ̄︶ ̄)
可是我们也有艺术细胞的,只不过大多都被code干掉了。
o(╥﹏╥)o
不过还好,计算机可以帮我们画画呀!感觉还不错,请大家欣赏一下。
作品展示
参考代码
参考代码1:
# 绘制素描图 sketch:草图,素描,梗概
from PIL import Image
import numpy as np
# 绘制素描图
def makeSketch(getUrl, saveUrl):
# 获取图片,将图片转化为,mode=L:灰度图,每个像素用 8 位二进制代码表示,astype:并将像素点转化为浮点类型的二维矩阵
a = np.array(Image.open(getUrl).convert('L')).astype('float')
depth = 10. # (0-100)
'''
梯度计算采用二阶精确中心差分
在内点和一阶或二阶精确的一面
(向前或向后)边界上的差异。
因此,返回的梯度具有与输入数组相同的形状。
'''
grad = np.gradient(a) # 获取图像灰度的梯度值 返回元组 gradient:梯度
grad_x, grad_y = grad # 分别取横纵图像梯度值
grad_x = grad_x * depth / 100.
grad_y = grad_y * depth / 100.
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')) # 重构图像 a = np.asarray(im)
im.save(saveUrl)
print('绘制素描画成功')
if __name__ == '__main__':
getUrl = r'./images/h.jpg'
saveUrl = r'./images/hh.jpg'
makeSketch(getUrl, saveUrl)
参考代码2:
# 绘制素描图 sketch:草图,素描,梗概
'''
首先呢,将彩色图转换成灰度图;
然后对灰度图进行求其反色的操作;
对得到的反色的图片结果采用一个高斯模糊的操作;
然后采用颜色亮化(color dodge)的技术再将第一步的灰度图和第三步操作后的图片进行混合,这样就成功地把图片搞成素描了。
'''
from PIL import Image, ImageFilter, ImageOps
# 将像素点颜色亮化
def dodge(a, b, alpha):
return min(int(a*255/(256-b*alpha)), 255)
# 绘制素描
def drawSketch(img, blur=25, alpha=1.0):
img1 = img.convert('L') # 图片转换成灰色
img2 = img1.copy() # 复制灰度图片
img2 = ImageOps.invert(img2) # 将图灰度片反色,invert:使前后倒置或反转
for i in range(blur): # 模糊度
img2 = img2.filter(ImageFilter.BLUR)
width, height = img1.size # 获取图片的大小
# 遍历两张图片的像素矩阵
for x in range(width):
for y in range(height):
a = img1.getpixel((x, y)) # Returns the pixel value at a given position
b = img2.getpixel((x, y)) # 返回指定位置的像素点值
img1.putpixel((x, y), dodge(a, b, alpha)) # Modifies the pixel at the given position.修改指定位置的像素点值
# 调用系统接口显示图片
img1.show()
# 保存图片到指定路径
img1.save(saveUrl)
print('绘制素描成功')
if __name__ == '__main__':
getUrl = './images/a.jpg'
saveUrl = './images/aaa.jpg'
img = Image.open(getUrl) # 获取图片
drawSketch(img)
后序
PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PIL。
PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow,pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持python3。
关于Pillow库的相关使用,有时间的话,我会单独整理出来。
蟹蟹欣赏啦!
(* ̄︶ ̄)
以上是关于谁说程序员不懂艺术与浪漫?(Python素描画:征服你)的主要内容,如果未能解决你的问题,请参考以下文章
给女友的网页小惊喜,(生日,周年,表白通用) ☞谁说程序员不懂浪漫