python实现读取并显示图片的两种方法


Posted in Python onJanuary 13, 2017

在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片。本人偏爱 matpoltlib,因为它的语法更像 matlab。

一、matplotlib

1. 显示图片

import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np

lena = mpimg.imread('lena.png') # 读取和代码处于同一目录下的 lena.png
# 此时 lena 就已经是一个 np.array 了,可以对它进行任意处理
lena.shape #(512, 512, 3)

plt.imshow(lena) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()

2. 显示某个通道

# 显示图片的第一个通道
lena_1 = lena[:,:,0]
plt.imshow('lena_1')
plt.show()
# 此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数,有如下几种添加方法:
plt.imshow('lena_1', cmap='Greys_r')
plt.show()

img = plt.imshow('lena_1')
img.set_cmap('gray') # 'hot' 是热量图
plt.show()

3. 将 RGB 转为灰度图

matplotlib 中没有合适的函数可以将 RGB 图转换为灰度图,可以根据公式自定义一个:

def rgb2gray(rgb):
  return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])

gray = rgb2gray(lena)  
# 也可以用 plt.imshow(gray, cmap = plt.get_cmap('gray'))
plt.imshow(gray, cmap='Greys_r')
plt.axis('off')
plt.show()

4. 对图像进行放缩

这里要用到 scipy

from scipy import misc
lena_new_sz = misc.imresize(lena, 0.5) # 第二个参数如果是整数,则为百分比,如果是tuple,则为输出图像的尺寸
plt.imshow(lena_new_sz)
plt.axis('off')
plt.show()

5. 保存图像

5.1 保存 matplotlib 画出的图像

该方法适用于保存任何 matplotlib 画出的图像,相当于一个 screencapture。

plt.imshow(lena_new_sz)
plt.axis('off')
plt.savefig('lena_new_sz.png')

5.2 将 array 保存为图像

from scipy import misc
misc.imsave('lena_new_sz.png', lena_new_sz)

5.3 直接保存 array

读取之后还是可以按照前面显示数组的方法对图像进行显示,这种方法完全不会对图像质量造成损失

np.save('lena_new_sz', lena_new_sz) # 会在保存的名字后面自动加上.npy
img = np.load('lena_new_sz.npy') # 读取前面保存的数组

二、PIL

1. 显示图片

from PIL import Image
im = Image.open('lena.png')
im.show()

2. 将 PIL Image 图片转换为 numpy 数组

im_array = np.array(im)
# 也可以用 np.asarray(im) 区别是 np.array() 是深拷贝,np.asarray() 是浅拷贝

3. 保存 PIL 图片

直接调用 Image 类的 save 方法

from PIL import Image
I = Image.open('lena.png')
I.save('new_lena.png')

4. 将 numpy 数组转换为 PIL 图片

这里采用 matplotlib.image 读入图片数组,注意这里读入的数组是 float32 型的,范围是 0-1,而 PIL.Image 数据是 uinit8 型的,范围是0-255,所以要进行转换:

import matplotlib.image as mpimg
from PIL import Image
lena = mpimg.imread('lena.png') # 这里读入的数据是 float32 型的,范围是0-1
im = Image.fromarray(np.uinit8(lena*255))
im.show()

5. RGB 转换为灰度图

from PIL import Image
I = Image.open('lena.png')
I.show()
L = I.convert('L')
L.show()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基础之函数用法实例详解
Sep 10 Python
Python 常用string函数详解
May 30 Python
Python实现识别手写数字大纲
Jan 29 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
PyQT实现多窗口切换
Apr 20 Python
pandas 选择某几列的方法
Jul 03 Python
用Python逐行分析文件方法
Jan 28 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
python中的被动信息搜集
Apr 29 Python
Python中的连接符(+、+=)示例详解
Jan 13 #Python
Python中datetime模块参考手册
Jan 13 #Python
python 计算文件的md5值实例
Jan 13 #Python
Python 字典与字符串的互转实例
Jan 13 #Python
python 安装virtualenv和virtualenvwrapper的方法
Jan 13 #Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 #Python
python递归删除指定目录及其所有内容的方法
Jan 13 #Python
You might like
PHP5 面向对象程序设计
2008/02/13 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
vue弹窗组件的实现示例代码
2018/09/10 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
Python兔子毒药问题实例分析
2015/03/05 Python
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
详解Python中for循环是如何工作的
2017/06/30 Python
python实现二分查找算法
2017/09/21 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
CSS3 实现的加载动画
2020/12/07 HTML / CSS
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
个人优缺点自我评价
2014/01/27 职场文书
推广活动策划方案
2014/08/23 职场文书
党员个人自我评价
2015/03/03 职场文书
团干部培训班心得体会
2016/01/06 职场文书