基于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 计算两个日期相差多少个月实例代码
May 24 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
11个Python3字典内置方法大全与示例汇总
May 13 Python
Python流行ORM框架sqlalchemy安装与使用教程
Jun 04 Python
python删除文件夹下相同文件和无法打开的图片
Jul 16 Python
python自动循环定时开关机(非重启)测试
Aug 26 Python
利用python Selenium实现自动登陆京东签到领金币功能
Oct 31 Python
Python线程协作threading.Condition实现过程解析
Mar 12 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
python opencv pytesseract 验证码识别的实现
Aug 28 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识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
nodeJS微信分享
2017/12/20 NodeJs
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
ES5和ES6中类的区别总结
2020/12/21 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
python使用7z解压apk包的方法
2015/04/18 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
python有几个版本
2020/06/17 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
中国跨境电子商务网站:NewFrog
2018/03/10 全球购物
优秀实习自我鉴定
2013/12/04 职场文书
根叔历年演讲稿
2014/05/20 职场文书
交通事故协议书范本
2014/11/18 职场文书
道士塔读书笔记
2015/06/30 职场文书
2016小学新学期寄语
2015/12/04 职场文书
教师外出学习心得体会
2016/01/18 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL