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简易教程——图像的数组表示相关推荐

  1. Numpy入门教程:01. 数组的创建与属性

    背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python.其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执 ...

  2. Numpy入门教程:03.数组操作

    背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python.其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执 ...

  3. Numpy简易教程7——读/写文件

    读/写文件 NumPy的文件读/写主要有二进制的文件读/写和文件列表形式的数据读/写两种形式.学会读/写文件是利用NumPy进行数据处理的基础.NumPy提供了若干函数,可以把结果保存到二进制或文本文 ...

  4. Numpy简易教程8——简易分析

    使用函数进行简单的统计分析 1.排序 NumPy的排序方式主要可以概括为直接排序和间接排序两种. 直接排序指对数值直接进行排序. 间接排序是指根据一个或多个键对数据集进行排序. 在NumPy中,直接排 ...

  5. Python模块(2)-Numpy 简易使用教程

    Numpy模块 简易使用教程 1.数组创建 2.数组基本属性-维度.尺寸.数据类型 3.数组访问-索引.切片.迭代 4.数组的算术运算-加减乘除.转置求逆.极大极小 5.通用函数-sin,cos,ex ...

  6. python 创建空的numpy数组_Numpy入门教程:01. 数组的创建与属性

    背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 -- Numerical和Python.其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: ...

  7. numpy 数组抽取_清晰易懂的Numpy入门教程

    原标题:清晰易懂的Numpy入门教程 翻译 | 石头 来源 | Machine Learning Plus Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pa ...

  8. python向量计算库教程_python中numpy基础学习及进行数组和矢量计算

    前言 在python 中有时候我们用数组操作数据可以极大的提升数据的处理效率,类似于R的向量化操作,是的数据的操作趋于简单化,在python 中是使用numpy模块可以进行数组和矢量计算. 下面来看下 ...

  9. AI基础:Numpy简易入门

    本文提供最简易的 Numpy 的入门教程,适合初学者.(黄海广) 1.Numpy 简易入门 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型.矢量处理,以及精密 ...

最新文章

  1. 低头是家和月光,抬头是车和远方
  2. 【数据结构-树】2.二叉树遍历与线索二叉树(图解+代码)
  3. Scala模式匹配:for循环表达式中的模式匹配
  4. ActiveServices
  5. linux如何运行多个硬盘,一个硬盘如何装两个Linux
  6. 【DOS】对指定目录下的指定文件类型进行打包
  7. 转!!ftp的主动模式(port)与被动模式(PASV)
  8. Javascript——DOM编程
  9. 狗和披萨:使用TensorFlow.js在浏览器中实现计算机视觉
  10. 【报告分享】斯坦福-2019人工智能指数年度报告.pdf(附293页报告现在链接)
  11. sql server 关联_SQL Server中的关联规则挖掘
  12. 洛谷 P3373 【模板】线段树 2 解题报告
  13. 扩展欧几里德算法的定义、解释、证明及其应用
  14. C语言_【学习笔记】二元一次方程的虚根
  15. 巃嵸鸿蒙构瑰材兮,明堂赋原文、翻译及赏析_李白古诗_风萧学古网
  16. 2022年蓝桥杯省赛 C/C++ A组题解
  17. 新年新气象,努力奋上新时代
  18. 用互联网思维去做事之-(2)用户思维
  19. adobe pdf 合并文件后提示“无法提取嵌入的字体”问题解决方法
  20. 红旗 linux 4.4系统安装,红旗Linux6.0 SP1桌面版安装 xfce 4.4.3 的方法

热门文章

  1. 经典批处理实现自动关机.BAT
  2. 双眼视图,立体成像和感知深度
  3. channl数据通道块代码层次理解 【MCDF项目】
  4. linux more 高亮_linux more命令的使用
  5. 您的iPhone 已停用解决办法
  6. 环模制粒机设计(说明书+CAD)
  7. python中.any() 和.all()的用法
  8. ACM:Capricorn's Trial
  9. redis-集群安装
  10. java用list集合实现对数据的增加,删除,插入操作