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

一、matplotlib

1. 显示图片

?
1
2
3
4
5
6
7
8
9
10
11
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. 显示某个通道

?
1
2
3
4
5
6
7
8
9
10
11
# 显示图片的第一个通道
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 图转换为灰度图,可以根据公式自定义一个:

?
1
2
3
4
5
6
7
8
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

?
1
2
3
4
5
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。

?
1
2
3
plt.imshow(lena_new_sz)
plt.axis('off')
plt.savefig('lena_new_sz.png')

5.2 将 array 保存为图像

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

5.3 直接保存 array

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

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

二、PIL

1. 显示图片

?
1
2
3
from PIL import Image
im = Image.open('lena.png')
im.show()

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

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

3. 保存 PIL 图片

直接调用 Image 类的 save 方法

?
1
2
3
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,所以要进行转换:

?
1
2
3
4
5
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 转换为灰度图

?
1
2
3
4
5
from PIL import Image
I = Image.open('lena.png')
I.show()
L = I.convert('L')
L.show()

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

您可能感兴趣的文章:

  • python从网络读取图片并直接进行处理的方法
  • python 实现上传图片并预览的3种方法(推荐)

原文链接:http://www.cnblogs.com/yinxiangnan-charles/p/5928689.html

转载于:https://www.cnblogs.com/jyxbk/p/8548202.html

python 用PIL Matplotlib处理图像的基本操作相关推荐

  1. Python可视化(matplotlib)图像自定义图例(Legend)

    Python可视化(matplotlib)图像自定义图例(Legend) 目录 Python可视化(matplotlib)图像自定义图例(Legend) 简单图例

  2. Python可视化(matplotlib)图像之误差可视化(Visualizing Errors)

    Python可视化(matplotlib)图像之误差可视化(Visualizing Errors) 目录 Python可视化(matplotlib)图像之误差可视化(Visualizing Error ...

  3. Python利用PIL将png图像转jpg图像

    文章目录 错误示例: 正确示例: 代码: 错误示例: 正确示例: 代码: from PIL import Image import os im = Image.open('./test.png')# ...

  4. python修片_python – Matplotlib savefig图像修剪

    我不断惊讶于在matplotlib中做同样的事情有多少种方式. 因此,我相信有人可以使这个代码更加简洁. 无论如何,这应该清楚地表明如何解决你的问题. >>> import pyla ...

  5. Python 读取图,旋转,缩放(PIL, matplotlib)

    Python 读取图,旋转,缩放(PIL, matplotlib) 2017-05-03 12:54 1133人阅读 评论(0) 收藏 举报  分类: python(20)  版权声明:本文为博主原创 ...

  6. Python练习 | Python之图像的基本操作和处理

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 ***************** ...

  7. python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算

    图像的基本操作 在上个教程中,我们介绍了使用鼠标画笔的功能.本次教程,我们将要谈及OpenCV图像处理的基本操作. 本次教程的所有操作基本上都和Numpy相关,而不是与OpenCV相关.要使用Open ...

  8. python使用matplotlib可视化线图(line plot)、使用arrow函数在matplotlib可视化图像中添加箭头(drawing arrows in matplotlib)

    python使用matplotlib可视化线图(line plot).使用arrow函数在matplotlib可视化图像中添加箭头(drawing arrows in matplotlib) 目录

  9. Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符)

    Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符) 目录

最新文章

  1. fullPage教程 -- 整屏滚动效果插件 fullpage详解
  2. django开发Blog(1)
  3. springcloud 组件_深入理解 Spring Cloud 核心组件与底层原理
  4. SpringBootAdmin客户端接入
  5. windows设备坐标和逻辑坐标的转换
  6. html标题前圆圈样式,漂亮的css3圆形鼠标悬停效果实例
  7. 华为砸数十亿美金作为奖励 刺激员工信心
  8. 在设计四人抢答器中灯全亮_数字电子技术课程设计报告(四人抢答器).doc
  9. PHP网站开启gzip压缩,PHP网站程序中开启Gzip压缩的两种方法
  10. 微信添加好友查找失败服务器繁忙,微信加载联系人失败_微信添加好友失败有哪些原因...
  11. oracle 同义词循环连,Oracle出现ORA-01775:同义词的循环链问题
  12. 太阳高度角/方位角计算公式
  13. 通过Excel对各个商品的销售分析
  14. android手机的语音助手在哪里设置,华为语音助手在哪设置 华为语音助手唤醒具体步骤...
  15. python snmp
  16. java ssh 服务器文件传输_java使用SFTP上传文件到资源服务器
  17. Ubuntu16.04 安装docker-ce [傻瓜教程]
  18. 安卓集成云闪付,以及So库冲突多moudle项目解决办法
  19. 量化交易 聚宽 布林带策略
  20. [算法][面试题]疯狂队列-排列使得序列两两间“差值的绝对值“之和最大

热门文章

  1. php 流量,PHP 流量控制语句的顶替语法
  2. 包含min函数的栈(important)
  3. 使用函数进行邮件发送的示例
  4. Day7—socket进阶
  5. spring boot maven profiles,打包不同的配置文件
  6. .net framework处理xml
  7. 爱奇艺2020校招编程题汇总第一题(切方块问题)
  8. Ranger开源贡献统计
  9. [蓝桥杯][2019年第十届真题c/c++B组]后缀表达式(解释sum -= 2*a[i])
  10. Java默认值规则——各种数据类型的初试值是什么?