基于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删除特定文件的方法
Jul 30 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
Python构建网页爬虫原理分析
Dec 19 Python
django加载本地html的方法
May 27 Python
python中使用print输出中文的方法
Jul 16 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
python 实现调用子文件下的模块方法
Dec 07 Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 Python
我就是这样学习Python中的列表
Jun 02 Python
Python-while 计算100以内奇数和的方法
Jun 11 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
python自动生成sql语句的脚本
Feb 24 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
PHP4.04简明安装
2006/10/09 PHP
php中计算时间差的几种方法
2009/12/31 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
2012/12/06 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
python中sets模块的用法实例
2014/09/30 Python
Python中自定义函数的教程
2015/04/27 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Python中修改字符串的四种方法
2018/11/02 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
Otel.com:折扣酒店预订
2017/08/24 全球购物
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
百度JavaScript笔试题
2015/01/15 面试题
校庆活动策划方案
2014/06/05 职场文书
宣传口号大全
2014/06/16 职场文书
go语言中http超时引发的事故解决
2021/06/02 Golang