基于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 相关文章推荐
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
Python实现的建造者模式示例
Aug 06 Python
python实现决策树分类
Aug 30 Python
python RabbitMQ 使用详细介绍(小结)
Nov 08 Python
Python 移动光标位置的方法
Jan 20 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
用Python画一个LinkinPark的logo代码实例
Sep 10 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
Dec 10 Python
使用pytorch 筛选出一定范围的值
Jun 28 Python
学习Python需要哪些工具
Sep 04 Python
python lambda的使用详解
Feb 26 Python
Python词云的正确实现方法实例
May 08 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 防注入函数(格式化数据)
2011/08/08 PHP
php重定向的三种方法分享
2012/02/22 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
深入探究PHP的多进程编程方法
2015/08/18 PHP
php session 写入数据库
2016/02/13 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
实例讲解php数据访问
2016/05/09 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
当鼠标移动时出现特效的JQuery代码
2013/11/08 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
python xml解析实例详解
2016/11/14 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
python多线程使用方法实例详解
2019/12/30 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
Pycharm调试程序技巧小结
2020/08/08 Python
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
Oracle性能调优原则
2012/05/03 面试题
装潢设计实习自我鉴定
2013/09/19 职场文书
领导检查欢迎词
2014/01/14 职场文书
优秀护士先进事迹
2014/05/08 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
学生会工作感言
2015/08/07 职场文书
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL
MySQL分库分表详情
2021/09/25 MySQL