Numpy简易教程——图像的数组表示
Numpy简易教程——图像的数组表示
文章目录
- Numpy简易教程——图像的数组表示
- 一.图像的表示模式
- 二.PIL库的使用
- 1.PIL库简介与下载,导入
- 2.图像的数组表示
- 3.图像的变换
- 下一篇:Matplotlib入门教程
一.图像的表示模式
图像一般采用RGB三通道色彩模式,每个像素点由红(R ),绿(G),蓝(B)三色组成。
取值范围为:
R:0-255
G:0-255
B:0-255
三者叠加就可获取到对应像素点的颜色,这种方式可以包含人眼可见的所有颜色,
因此使用广泛
二.PIL库的使用
1.PIL库简介与下载,导入
PIL:Python Image Libaray,是一个具有处理图像的强大功能的第三方库
下载命令:pip install pillow
导入使用Image对象的方式:From PIL import Image
2.图像的数组表示
import numpy as np;
from PIL import Image;
#读入数据并保存为数组
a = np.array(Image.open("D:/Jupyter_NoteBook/1单神经元网络/images/cat01.jpg"));
print(a.shape,a.dtype)
结果为:(625, 500, 3) uint8
含义:625表示图像高,500表示宽度,3表示RGB的值
3.图像的变换
import numpy as np;
from PIL import Image;
#读入数据并保存为数组
a = np.array(Image.open("D:/Jupyter_NoteBook/1单神经元网络/images/cat02.jpg"));
print(a.shape,a.dtype)
Im = Image.fromarray((255-a).astype("uint8"))#将a数组处理为Image对象并返回
Im.save("D:/Jupyter_NoteBook/1单神经元网络/images/stars-new.jpg")
原图:
更改后的:
如果想得到灰色图片可以采用convert函数
import numpy as np;
from PIL import Image;
#读入数据并保存为数组
a = np.array(Image.open("D:/Jupyter_NoteBook/1单神经元网络/images/cat02.jpg").convert('L'));
print(a.shape,a.dtype)
Im = Image.fromarray((255-a).astype("uint8"))#将a数组处理为Image对象并返回
Im.save("D:/Jupyter_NoteBook/1单神经元网络/images/stars-new.jpg")
(437, 1200) uint8这个运行结果表明此时元素的值不在对应RGB值,而是一个灰度值
效果如下:
纯黑白就是不用255减去即可:
当然上面这个比较淡,要想重色可以这样:
import numpy as np;
from PIL import Image;
#读入数据并保存为数组
a = np.array(Image.open("D:/Jupyter_NoteBook/1单神经元网络/images/cat02.jpg").convert('L'));
print(a.shape,a.dtype)
Im = Image.fromarray(((a/255)**2*255).astype("uint8"))#将a数组处理为Image对象并返回
Im.save("D:/Jupyter_NoteBook/1单神经元网络/images/stars-new.jpg")
效果如下:
下面我们实现手绘效果:
首先介绍手绘的几个要素:
①黑白灰色
②边界线条较重
③相同或相近色彩趋近白色
④略有光源效果
实际上我们的手绘风格是在获取了灰度值数组后进行处理得到的
灰度值代表图片的明暗,梯度代表图片灰度的变化率,通过调整像素的梯度值
间接改变明暗变化,最后是立体效果值通过添加虚拟深度值来实现(这一步需要归一化处理)
from PIL import Image
import numpy as np
a = np.asarray(Image.open("D:/Jupyter_NoteBook/1单神经元网络/images/jack.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./Avec_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('jackson.jpg')
原图:
效果图:
上面这段代码直接复制使用即可,原理比较复杂,涉及到一些比较专业的知识(其实我也不甚明白)
下一篇:Matplotlib入门教程
Numpy简易教程——图像的数组表示相关推荐
- Numpy入门教程:01. 数组的创建与属性
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python.其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执 ...
- Numpy入门教程:03.数组操作
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python.其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执 ...
- Numpy简易教程7——读/写文件
读/写文件 NumPy的文件读/写主要有二进制的文件读/写和文件列表形式的数据读/写两种形式.学会读/写文件是利用NumPy进行数据处理的基础.NumPy提供了若干函数,可以把结果保存到二进制或文本文 ...
- Numpy简易教程8——简易分析
使用函数进行简单的统计分析 1.排序 NumPy的排序方式主要可以概括为直接排序和间接排序两种. 直接排序指对数值直接进行排序. 间接排序是指根据一个或多个键对数据集进行排序. 在NumPy中,直接排 ...
- Python模块(2)-Numpy 简易使用教程
Numpy模块 简易使用教程 1.数组创建 2.数组基本属性-维度.尺寸.数据类型 3.数组访问-索引.切片.迭代 4.数组的算术运算-加减乘除.转置求逆.极大极小 5.通用函数-sin,cos,ex ...
- python 创建空的numpy数组_Numpy入门教程:01. 数组的创建与属性
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 -- Numerical和Python.其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: ...
- numpy 数组抽取_清晰易懂的Numpy入门教程
原标题:清晰易懂的Numpy入门教程 翻译 | 石头 来源 | Machine Learning Plus Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pa ...
- python向量计算库教程_python中numpy基础学习及进行数组和矢量计算
前言 在python 中有时候我们用数组操作数据可以极大的提升数据的处理效率,类似于R的向量化操作,是的数据的操作趋于简单化,在python 中是使用numpy模块可以进行数组和矢量计算. 下面来看下 ...
- AI基础:Numpy简易入门
本文提供最简易的 Numpy 的入门教程,适合初学者.(黄海广) 1.Numpy 简易入门 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型.矢量处理,以及精密 ...
最新文章
- 低头是家和月光,抬头是车和远方
- 【数据结构-树】2.二叉树遍历与线索二叉树(图解+代码)
- Scala模式匹配:for循环表达式中的模式匹配
- ActiveServices
- linux如何运行多个硬盘,一个硬盘如何装两个Linux
- 【DOS】对指定目录下的指定文件类型进行打包
- 转!!ftp的主动模式(port)与被动模式(PASV)
- Javascript——DOM编程
- 狗和披萨:使用TensorFlow.js在浏览器中实现计算机视觉
- 【报告分享】斯坦福-2019人工智能指数年度报告.pdf(附293页报告现在链接)
- sql server 关联_SQL Server中的关联规则挖掘
- 洛谷 P3373 【模板】线段树 2 解题报告
- 扩展欧几里德算法的定义、解释、证明及其应用
- C语言_【学习笔记】二元一次方程的虚根
- 巃嵸鸿蒙构瑰材兮,明堂赋原文、翻译及赏析_李白古诗_风萧学古网
- 2022年蓝桥杯省赛 C/C++ A组题解
- 新年新气象,努力奋上新时代
- 用互联网思维去做事之-(2)用户思维
- adobe pdf 合并文件后提示“无法提取嵌入的字体”问题解决方法
- 红旗 linux 4.4系统安装,红旗Linux6.0 SP1桌面版安装 xfce 4.4.3 的方法