当前位置 博文首页 > momoda118的博客:python-20行代码将图片转素描画(附源码和成品

    momoda118的博客:python-20行代码将图片转素描画(附源码和成品

    作者:[db:作者] 时间:2021-08-16 21:58

    一、前言

    用python画素描画的方式有很多种,

    常见的有通过opencv、pil来进行转换

    这里给大家分享通过pil实现图片转素描风格绘画的方式。

    对人像的转换出来看就一般,对风景的转化看着还行。

    大佬可优化一下算法。

    二、效果

    1.风景

    原图:
    在这里插入图片描述
    转换后:
    在这里插入图片描述

    2.人像

    原图:
    在这里插入图片描述
    转换后:
    在这里插入图片描述

    3.物品

    原图:
    在这里插入图片描述
    转换后:
    在这里插入图片描述

    三、环境要求

    1.python3+
    2.numpy
    3.pillow

    四、源码分享

    from PIL import Image
    import numpy as np
    import tkinter.filedialog
    root = tkinter.Tk().withdraw()
    filename = tkinter.filedialog.askopenfilename()  # 打开选择文件对话框
    try:
        depth = 30  # 0-100,越高,颜色越深
        picture_grad = np.gradient(np.asarray(Image.open(filename).convert('L')).astype('int'))  # 取图像灰度的梯度值
        grad_x, grad_y = picture_grad[0] * depth / 100., picture_grad[1] * depth / 100.  # 将获取的维度梯度值进行深度处理
        base = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)  # 降噪基
        _x, _y, _z = grad_x / base, grad_y / base, 1. / base
        sce_z, sce_x = np.pi / 2.1, np.pi / 3  # 光源的俯视角度值和方位角度值
        # 光源对x,y,z 轴的影响
        dx, dy, dz = np.cos(sce_z) * np.cos(sce_x), np.cos(sce_z) * np.sin(sce_x), np.sin(sce_z)
        Normalized = 255 * (dx * _x + dy * _y + dz * _z).clip(0, 255)  # 光源归一化
        im = Image.fromarray(Normalized.astype('uint8'))  # 重构图像
        im.save('转换后的素描图.jpg')  # 保存转换后的图片
        im.show()  # 展示转换后的图片
    except Exception:
        print('转换失败!')
    

    五、成品分享

    可直接运行版下载地址:

    已经打包成exe文件了,Windows环境下可直接点击运行
    百度网盘下载地址:https://pan.baidu.com/s/1iz3qKx7kLIIwFsOTujDxQg
    提取码:1lb7

    CSDN下载地址:https://download.csdn.net/download/momoda118/20719184

    分享暂时到这里,小伙伴们点赞、收藏、评论是对我最大的支持!!

    欢迎访问往期文章!

    六、往期文章回顾

    python小爬虫-28行代码实现图形化在线翻译!

    python-85行代码完成贪吃蛇和关卡升级:是男人就坚持到第10关!

    cs