Python中操作图像的方法包括opencv,matplotlib,PIL。

(一) opencv:

import cv2 as cv
# load
img = cv.imread(imagepath)
# shape=(height, width, channel)
h,w,c = img.shape
# show
cv.imshow('window_title', img)
# save
cv.imwrite(savepath, img)

(二) matplotlib:

import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np# load
img = mpimg.imread('cat.jpg')
# 此时 img 就已经是一个 np.array 了,可以对它进行任意处理
# height, width, channel=(360, 480, 3)
h,w,c = img.shape # show
plt.imshow(img) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()# save
# 适用于保存任何 matplotlib 画出的图像,相当于一个 screencapture
plt.savefig('fig_cat.png')

注意到:
* plt.imshow(image)中的图片的数据类型可以使np.array类型
* mpimg 既提供了加载图像函数imread,又提供了保存图像函数imsave
* plt.savefig函数 可以将显示在fig中图像保存下来

待补充mpimg.imsave()和plt.savefig()使用demo。

matplotlib 扩展:
1.图像缩放、显示
from scipy import misc
lena_new_sz = misc.imresize(img, 0.5) # 第二个参数如果是整数,则为百分比,如果是tuple,则为输出图像的尺寸
plt.imshow(img_new_sz)
plt.axis('off')
plt.show()
matplotlib 扩展:
2. 将np.array保存为图像、直接保存np.array
# 2.1 np.array=>image file
from scipy import misc
misc.imsave('img_new_sz.png', img_new_sz)
"""
from scipy import misc
# load image
lena = misc.imread('lena.png')
# <type 'numpy.ndarray'>
type(lena)
# lena.shape, lena.dtype
"""# 2.2 np.array=>np data file
import numpy as np
np.save('img_new_sz', img_new_sz) # 会在保存的名字后面自动加上.npy
img = np.load('img_new_sz.npy') # 读取前面保存的数组

注意: np.array数据可以通过np.save函数直接保存在磁盘上,扩展名为.npy, 通过np.load函数直接恢复; scipy.misc提供了对numpy.array格式图像的处理函数,特别是misc.imsave函数可以直接将np.array数据保存成图像文件。


(三) PIL

加载并显示图像(*)

from PIL import Image
# load
im = Image.open('cat.jpg')# show
im.show()"""
# 返回 image's size w,h = (480, 360)
w,h = img.size# PIL.JpegImagePlugin.JpegImageFile
type(img)# 直接调用Image类的save方法
img.save('new_cat.png')
"""

加载并显示图像(**)

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('/home/wanghao/Pictures/001.jpg')
plt.figure("head")
plt.imshow(img)
plt.show()

PIL图片和numpy数组间的转换

"""
# PIL Image => np.array
# 也可以用 np.asarray(im),区别是
# np.array() 是深拷贝,np.asarray() 是浅拷贝
"""
im_array = np.array(im)"""
这里采用 matplotlib.image 读入图片数组
注意:
这里读入的数组是 float32 型的,范围是 0-1;
PIL.Image 数据是 uinit8 型的,范围是0-255,所以要进行转换;
"""
import matplotlib.image as mpimg
from PIL import Image
img = mpimg.imread('cat.jpg') # 这里读入的数据是 float32 型的,范围是0-1
# 方法转换之后显示效果不好
img = Image.fromarray(np.uint8(img*255))
img.show()

注意: numpy转PIL Image后显示效果很差,不如 转成numpy后使用matplotlib显示好


(四) 总结

  • 在可以选择使用哪个图像库最终显示图像的时候,个人觉得使用 matplotlib库集成好的函数去直接加载和显示图像(来自matplotlib的image.imread 或 PIL的Image.open)效果更好;

  • 将内存中结果整个保存成图片的时候,要优先考虑 转成 np.array后使用 scipy.misc保存成图片;

  • 待补充: 如果对图像进行各种绘图相关操作,怎样才是更好的选择,使得从图像加载, 绘制的方便,以及最终的保存的过程更简单?


参考:

  • Python中显示图片
  • python 读取并显示图片的两种方法
  • Python使用scipy和numpy操作处理图像

Python中读取,显示,保存图片的方法相关推荐

  1. python图片保存_Python中读取,显示,保存图片的方法

    一 opencv importcv2 as cv#load img =cv.imread(imagepath)#shape=(height, width, channel) h,w,c =img.sh ...

  2. Python 中读取和保存图像方法汇总及其区别

    方法一:利用 PIL 中的 Image 函数 这个函数读取出来不是 array 格式,这时候需要用 np.asarray(im) 或者 np.array()函数 .区别:np.array() 是深拷贝 ...

  3. 在Python中读取MATLAB的数据文件

    简 介: 本文测试了几种通过python直接读取MATLAB的**.MAT格式的数据文件,有些方法经过测试发现无法完成.而通过mat4py可以比较方便的读取MATLAB中的数据文件.利用手边已有的用于 ...

  4. python获取剪切板内容_如何从python中读取(windows)剪贴板中的文本?

    如何从python中读取(windows)剪贴板中的文本? 如何从python中读取(windows)剪贴板中的文本? Foo42 asked 2019-06-22T21:38:33Z 10个解决方案 ...

  5. python文件处理seek()方法的参数是,在Python中操作文件之seek()方法的使用教程

    在Python中操作文件之seek()方法的使用教程 seek()方法在偏移设定该文件的当前位置.参数是可选的,默认为0,这意味着绝对的文件定位,它的值如果是1,这意味着寻求相对于当前位置,2表示相对 ...

  6. 在python中读取文件时如何去除行末的换行符以及在Windows与Linux中的区别

    [时间]2018.11.14 [题目]在python中读取文件时如何去除行末的换行符以及在Windows与Linux中的区别 一.去除换行符 以使用readline进行读取为例: import red ...

  7. 如何在 Python 中读取 .data 文件?

    什么是 .data 文件? 创建.data文件是为了存储信息/数据. 此格式的数据通常以逗号分隔值格式或制表符分隔值格式放置. 除此之外,该文件可以是二进制或文本文件格式.在这种情况下,我们将不得不找 ...

  8. python对文件操作-python中文件操作的其他方法

    Python中文件操作的一般方法,包括打开,写入,关闭.本文中介绍下python中关于文件操作的其他比较常用的一些方法. 首先创建一个文件poems: p=open("poems" ...

  9. python中读取文件过程中seek()函数的使用

    python中读取文件过程中seek()函数的使用 目录 概述: 语法: 参数: 返回值: 实例: 概述: seek() 方法用于移动文件读取指针到指定位置. 语法: seek() 方法语法如下: 文 ...

最新文章

  1. C# - 委托中的逆变
  2. Ubuntu中的超级兔子:Tweak安装教程
  3. on条件与where条件的区别
  4. 他在 B 站有 178 万粉丝,今天免费带你玩转 Python
  5. MOSS关于Workflow
  6. linux下c语言图形界面实现,「分享」C语言如何编写图形界面
  7. 用javascript获取屏幕高度和宽度等信息
  8. android webview 清空内容,Android WebView清空缓存
  9. java打印两个小人_Swing多线程实现奔跑的小人动画代码实现 | 彬菌
  10. 磁盘驱动属于计算机的,计算机基本知识(8005)---HDD(硬盘驱动器Hard Disk Drive)
  11. 苹果手机绕过密码和指纹自动支付,细思极恐!
  12. 京东云云主机试用体验
  13. SAP:传输请求SE09->STMS
  14. JSP+ssm计算机毕业设计快递代取系统的设计与实现94wcw【源码、数据库、LW、部署】
  15. Python编程快速入门
  16. POJ2228 Naptime 【例题精讲】
  17. wps文本中表格表头重复_WPS表格如何在每页都设置相同表头,原来是这样的
  18. Unity SRP URP HDRP 的区别
  19. 21、Java——超市会员管理系统(对象+集合)
  20. Listen的安装各使用方法(附官网和安装包链接。)

热门文章

  1. 域名解析协议-DNS
  2. Lock wait timeout exceeded; try restarting transaction
  3. 微信关键字自动回复功能实现
  4. GFP_ATOMIC or GFP_KERNEL 区别
  5. 自己搭建的网站,浏览器无法访问此页面解决方法
  6. Linux如何卸载软件
  7. WebRequest 类
  8. 基于xilinx-IP的FIR滤波器多通道实现
  9. before和after怎么区分_before和after区别 关于before和after
  10. 【SCI\EI】英语论文中的常用字体是什么