基于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读取配置文件模块ConfigParser
May 11 Python
Django内容增加富文本功能的实例
Oct 17 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
pandas dataframe添加表格框线输出的方法
Feb 08 Python
Python正则表达式匹配和提取IP地址
Jun 06 Python
用django-allauth实现第三方登录的示例代码
Jun 24 Python
python的pyecharts绘制各种图表详细(附代码)
Nov 11 Python
Python实现AI自动抠图实例解析
Mar 05 Python
Python调用jar包方法实现过程解析
Aug 11 Python
如何使用python写截屏小工具
Sep 29 Python
python 发送邮件的四种方法汇总
Dec 02 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 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语法(5)
2006/10/09 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
Prototype框架详解
2015/11/25 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
解读python如何实现决策树算法
2018/10/11 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python 变量初始化空列表的例子
2019/11/28 Python
python ubplot使用方法解析
2020/01/10 Python
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
平安建设工作方案
2014/06/02 职场文书
机电专业求职信
2014/06/14 职场文书
新员工试用期自我评价
2015/03/10 职场文书
2015年司法所工作总结
2015/04/27 职场文书
功夫熊猫观后感
2015/06/10 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL