基于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使用cookie库操保存cookie详解
Mar 03 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
Jul 24 Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
python实现学生信息管理系统
Apr 05 Python
Python实现读取字符串按列分配后按行输出示例
Apr 17 Python
浅析Python 读取图像文件的性能对比
Mar 07 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
Pytorch之contiguous的用法
Dec 31 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 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实现的英文名字全拼随机排号脚本
2014/07/04 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
javascript getElementsByName()的用法说明
2009/07/31 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
Python实现字典依据value排序
2016/02/24 Python
Python 多进程和数据传递的理解
2017/10/09 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
python中强大的format函数实例详解
2018/12/05 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
django ajax发送post请求的两种方法
2020/01/05 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
自考生毕业自我鉴定
2013/10/10 职场文书
工程师岗位职责
2013/11/08 职场文书
市场部规章制度
2014/01/24 职场文书
公司年底活动方案
2014/08/17 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
高一军训感想
2015/08/07 职场文书
AJAX实现省市县三级联动效果
2021/10/16 Javascript