基于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分割TXT文件成4K的TXT文件
May 23 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
python中的句柄操作的方法示例
Jun 20 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
关于python中plt.hist参数的使用详解
Nov 28 Python
Python SSL证书验证问题解决方案
Jan 13 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
python实现简单俄罗斯方块
Mar 13 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 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 分页原理详解
2009/08/21 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
CI框架中数据库操作函数$this->db->where()相关用法总结
2016/05/17 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
用jscript实现新建word文档
2007/06/15 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
2015/09/04 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
python实现三维拟合的方法
2018/12/29 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
大学生专业个人学习的自我评价
2013/10/26 职场文书
中学生团员自我评价分享
2013/12/07 职场文书
网络程序员自荐信
2014/01/25 职场文书
保安岗位职责
2014/02/21 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
创先争优标语
2014/06/27 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers