前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 神仙姐姐图像手绘效果实现

Python 神仙姐姐图像手绘效果实现

作者头像
叶庭云
发布2021-06-08 21:53:15
9800
发布2021-06-08 21:53:15
举报
文章被收录于专栏:Python进阶之路

文章目录

一、图像的 RGB 色彩模式

  • 图像一般使用 RGB 色彩模式,即每个像素点的颜色由红R绿G蓝B三个通道组成
  • RGB三个颜色通道的变化和叠加得到各种颜色,其中红绿蓝的取值范围都是0-255
  • RGB形成的颜色包括了人类视力所能感知的所有颜色

二、Python的 PIL 库

  • Python Imaging Library ( PIL ) 给 Python 增加了图像处理能力。这个库提供了广泛的文件格式支持,高效的内部展现,以及十分强大的图像处理能力。
  • 图像存储:PIL设计用于图像归档和图像批量处理,你可以使用它建立缩略图,转换格式,打印图片等等。现在的版本可以验证和读取大量的图片格式。而写入有意设计为只能写入常用的文件格式。
  • 图像显示:现在的版本包含了 Tk PhotoImage 和 BitmapImage 接口,以及 Windows DIB interface,这有助于在 Windows 下使用。为了方便测试,还提供了 show() 方法,可以保存图像到磁盘并显示。
  • 图像处理:这个库包含了基本的图像处理功能,包括点操作,使用内置卷积内核过滤,色彩空间转换。这个库还支持更改图像大小、旋转、自由变换。有一个直方图方法允许你统计图像,这可以用于对比度增强和全局统计分析。

PIL库是一个具有强大图像处理能力的 Python 第三方库,在 Anaconda 中是已经安装好的,命令行下安装方法如下:

代码语言:javascript
复制
pip install pillow -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

三、图像的数组表示

图像是一个由像素组成的二维矩阵,每一个元素是一个 RGB 值。

代码语言:javascript
复制
from PIL import Image
import numpy as np

im = np.array(Image.open(r'D:\test\001.jpg'))   # 打开一个图片  生成数组对象
print(im.shape, im.dtype)

# 输出结果
# (854, 960, 3) uint8

图像是一个三维数组,维度分别表示高度、宽度、和像素 RGB 值。

四、图像的变换

图像可以表示为数组,而数组是可以运算的,经过运算后的数组可以改变图像形状,对图像进行变换。读入图像后,获得像素 RGB 的值,修改后保存为新的文件。

原始图片如下:

计算 RGB 三个通道的补值,得到新的图像。

代码语言:javascript
复制
from PIL import Image
import numpy as np

a = np.array(Image.open(r'D:\test\001.jpg'))   # 打开一个图片  生成数组对象
print(a.shape, a.dtype)
b = [255, 255, 255] - a    # 计算RGB三个通道的补值
im = Image.fromarray(b.astype('uint8'))  # 重新生成图片对象
im.save(r'D:\test\002.jpg')              # 保存为新的jpg图片

效果如下:

将一个彩色图像变成灰度值的图像,再对灰度值取反。

代码语言:javascript
复制
from PIL import Image
import numpy as np

# 调用convert('L')  将一个彩色图片变成灰度值的图片
a = np.array(Image.open(r'D:\test\001.jpg').convert('L'))   # 打开一个图片  生成数组对象  得到灰度值
print(a.shape, a.dtype)
c = 255 - a   # 对灰度值取反
im = Image.fromarray(c.astype('uint8'))
im.save(r'D:\test\003.jpg')

效果如下:

对图像做区间变换

代码语言:javascript
复制
from PIL import Image
import numpy as np

a = np.array(Image.open(r'D:\test\001.jpg').convert('L'))   # 打开一个图片  生成数组对象  得到灰度值
print(a.shape, a.dtype)
d = (100 / 255) * a + 150   # 区间变换
im = Image.fromarray(d.astype('uint8'))
im.save(r'D:\test\004.jpg')

效果如下:

图像像素平方

代码语言:javascript
复制
from PIL import Image
import numpy as np

a = np.array(Image.open(r'D:\test\001.jpg').convert('L'))   # 打开一个图片  生成数组对象  得到灰度值
print(a.shape, a.dtype)
e = 255 * (a / 255) ** 2    # 像素平方
im = Image.fromarray(e.astype('uint8'))
im.save(r'D:\test\005.jpg')

效果如下:

五、图像的手绘效果实现

图像手绘效果的特征:黑白灰色、边界线条较重、相同或相近色彩趋于白色、略有光源效果。手绘风格是在对图像进行灰度化的基础上由立体效果和明暗效果叠加而成的,灰度实际代表了图像的明暗变化,而梯度表示的灰度的变化率。所以可以通过调整像素的梯度值来间接改变图像的明暗程度,立体效果则通过添加虚拟深度值来实现。

代码语言:javascript
复制
from PIL import Image
import numpy as np

a = np.asarray(Image.open(r'D:\test\001.jpg').convert('L')).astype('float')

# 根据灰度变化来模拟人类视觉的明暗程度
depth = 10.              # 预设虚拟深度值为10   范围为0-100
grad = np.gradient(a)    # 提取梯度值
grad_x, grad_y = grad    # 提取x y方向梯度值  解构赋给grad_x,grad_y

# 利用像素之间的梯度值和虚拟深度值对图像进行重构
grad_x = grad_x * depth / 100.    
grad_y = grad_y * depth / 100.   # 根据深度调整 x y 方向梯度值

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)                                  # 为了避免数据越界,将生成辉度值裁剪至0-255区间
im = Image.fromarray(b.astype('uint8'))  # 图像重构
im.save(r'D:\test\006.jpg')              # 保存图片               

图像手绘效果如下:

本文参考了 pillow 库官方文档和北京理工大学嵩天老师的 Python 数据分析与展示课的其中一个单元。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、图像的 RGB 色彩模式
  • 二、Python的 PIL 库
  • 三、图像的数组表示
  • 四、图像的变换
  • 五、图像的手绘效果实现
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档