基于python实现把图片转换成素描


Posted in Python onNovember 13, 2019

这篇文章主要介绍了基于python实现把图片转换成素描,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

导语:

你是否还在为当时年少时没有选择自己的梦想而伤心,是否还在为自己的无法成为绘画名家而苦恼,这一切都不需要担心。python都能帮你实现,诶!python怎么能画画呢,一些简单的图案没问题,但是我要是想画素描那肯定没有办法了呀!

需求分析:

通过python代码脚本,实现绘制素描

安装工具

pip install pillow
pip install numpy

代码实现

首先我们需要看一下我们需要的原图:

基于python实现把图片转换成素描

这是一头大水牛,那我们要如何将它变成一幅素描画呢?

来看我们第一种方案:

# -*- coding: utf-8 -*-
from PIL import Image
from random import randint

old = Image.open(r"da.jpg")
new = Image.new('L', old.size, 255)
w, d = old.size
old = old.convert('L')
PEN_SIZE = 3
COLOR_DIFF = 7
LINE_LEN = 2

for i in range(PEN_SIZE + 1, w - PEN_SIZE - 1):
  for j in range(PEN_SIZE + 1, d - PEN_SIZE - 1):
    originalcolor = 255
    lcolor = sum([old.getpixel((i - r, j))
           for r in range(PEN_SIZE)]) // PEN_SIZE
    rcolor = sum([old.getpixel((i + r, j))
           for r in range(PEN_SIZE)]) // PEN_SIZE
    if abs(lcolor - rcolor) > COLOR_DIFF:
      originalcolor -= (255 - old.getpixel((i, j))) // 4
      for p in range(-LINE_LEN + randint(-1, 1), LINE_LEN + randint(-1, 1)):
        new.putpixel((i, j + p), originalcolor)

    ucolor = sum([old.getpixel((i, j - r))
           for r in range(PEN_SIZE)]) // PEN_SIZE
    dcolor = sum([old.getpixel((i, j + r))
           for r in range(PEN_SIZE)]) // PEN_SIZE
    if abs(ucolor - dcolor) > COLOR_DIFF:
      originalcolor -= (255 - old.getpixel((i, j))) // 4
      for p in range(-LINE_LEN + randint(-1, 1), LINE_LEN + randint(-1, 1)):
        new.putpixel((i + p, j), originalcolor)

    lucolor = sum([old.getpixel((i - r, j - r))
            for r in range(PEN_SIZE)]) // PEN_SIZE
    rdcolor = sum([old.getpixel((i + r, j + r))
            for r in range(PEN_SIZE)]) // PEN_SIZE
    if abs(lucolor - rdcolor) > COLOR_DIFF:
      originalcolor -= (255 - old.getpixel((i, j))) // 4
      for p in range(-LINE_LEN + randint(-1, 1), LINE_LEN + randint(-1, 1)):
        new.putpixel((i - p, j + p), originalcolor)

    rucolor = sum([old.getpixel((i + r, j - r))
            for r in range(PEN_SIZE)]) // PEN_SIZE
    ldcolor = sum([old.getpixel((i - r, j + r))
            for r in range(PEN_SIZE)]) // PEN_SIZE
    if abs(rucolor - ldcolor) > COLOR_DIFF:
      originalcolor -= (255 - old.getpixel((i, j))) // 4
      for p in range(-LINE_LEN + randint(-1, 1), LINE_LEN + randint(-1, 1)):
        new.putpixel((i + p, j + p), originalcolor)

new.save(r"pencil_drawing.jpg")

基于python实现把图片转换成素描

我们这第一份素描图案时以线条为单位进行素描的,而且还增加了随机函数,图案中线条的长度不确定,这样创作的素描看上去更加柔和,看起来更加接近真实的人类作画的风格。

但是这个方法有一些弊端,

一是代码量较多

二是执行速度过慢

你想通过这个方式实现一个素描图案,需要等待很长时间。

那么有没有更好的方式呢?

来,我们再来看,接下来我们要用一种更友好的方式来实现这个需求

from PIL import Image
import numpy as np

a = np.asarray(Image.open('牛.jpg').convert('L')).astype('float')
depth = 10. # (0-100)
grad = np.gradient(a) # 取图像灰度的梯度值
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')) # 重构图像
im.save('new.jpg')

基于python实现把图片转换成素描

可能细心一点,大家可以看到我使用的是,数据分析,金融量化,机器学习,人工智能的必备工具包numpy,而且代码量缩短的二十几行了,效果相较于上面那种方式,还要更好一些,运行的速度也要快很多倍。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
举例讲解Python中的list列表数据结构用法
Mar 12 Python
python中实现迭代器(iterator)的方法示例
Jan 19 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
Python pycharm 同时加载多个项目的方法
Jan 17 Python
用Python实现BP神经网络(附代码)
Jul 10 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
Jupyter notebook 启动闪退问题的解决
Apr 13 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 Python
python实现对doc、txt、xls等文档的读写操作
Apr 02 Python
Django连接数据库并实现读写分离过程解析
Nov 13 #Python
Pandas操作CSV文件的读写实现方法
Nov 13 #Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 #Python
Series和DataFrame使用简单入门
Nov 13 #Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 #Python
Python坐标线性插值应用实现
Nov 13 #Python
python如果快速判断数字奇数偶数
Nov 13 #Python
You might like
提升PHP执行速度全攻略
2006/10/09 PHP
PHP伪静态写法附代码
2008/06/20 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
js使用递归解析xml
2014/12/12 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
python2.7安装图文教程
2018/03/13 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
Python如何根据时间序列数据作图
2020/05/12 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
python推导式的使用方法实例
2021/02/28 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
生日派对邀请函
2014/01/13 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
制作部班长职位说明书
2014/02/26 职场文书
委托书样本
2014/04/02 职场文书
干部个人考察材料
2014/12/24 职场文书
2015年度物流工作总结
2015/04/30 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android