谁说程序员不懂艺术与浪漫?(Python素描画:征服你)

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁说程序员不懂艺术与浪漫?(Python素描画:征服你)相关的知识,希望对你有一定的参考价值。

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素描画:征服你)的主要内容,如果未能解决你的问题,请参考以下文章

给女友的网页小惊喜,(生日,周年,表白通用) ☞谁说程序员不懂浪漫

程序员速学!女孩子拒绝不了这样的浪漫!宝啊..

谁说程序员不浪漫——给女友放个烟花,安排!安排!

程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果

谁说技术男不浪漫!90后程序员2天做出猫咪情绪识别软件

谁说技术男不浪漫!90后程序员2天做出猫咪情绪识别软件