Python 中各种imread函数的区别与联系
最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误。如果你正好也对此感到困惑可以看下这篇总结。当然,要了解具体的细节,还是应该 read the fuck code和API document,但貌似python的很多模块文档都不是很全,所以只能多看代码和注释了。

先来看看常用的读取图片的方式:

  • PIL.Image.open
  • scipy.misc.imread
  • scipy.ndimage.imread
  • cv2.imread
  • matplotlib.image.imread
  • skimge
  • caffe.io.load_iamge

知乎上有篇帖子专门介绍了这些方法的性能Python的各种imread函数在实现方式和读取速度上有何区别?
这些方法可以分为四大家族
PIL

PIL.Image.open + numpy
scipy.misc.imread
scipy.ndimage.imread这些方法都是通过调用PIL.Image.open 读取图像的信息;
PIL.Image.open 不直接返回numpy对象,可以用numpy提供的函数进行转换,参考Image和Ndarray互相转换;
其他模块都直接返回numpy.ndarray对象,通道顺序为RGB,通道值得默认范围为0-255

Image与Ndarray互相转换

matplotlib
matplot.image.imread

从名字中可以看出这个模块是具有matlab风格的,直接返回numpy.ndarray格式通道顺序是RGB,通道值默认范围0-255。

opencv
cv2.imread

使用opencv读取图像,直接返回numpy.ndarray 对象,通道顺序为BGR ,注意是BGR,通道值默认范围0-255。

skimage
skimage.io.imread: 直接返回numpy.ndarray 对象,通道顺序为RGB,通道值默认范围0-255。 
caffe.io.load_image: 没有调用默认的skimage.io.imread,返回值为0-1的float型数据,通道顺序为RGB

关于图像的一些说明
可以使用matplotlib的pyplot模块的show也可以使用cv2的imshow方法,对于这些方法只要你传入的参数是numpy.ndarray(通道值范围0-255) 就可以正常显示,不存在区别,这也可以看出numpy在python中的重要地位;但是cv2.imshow方法由于它针对的是cv2的imread 所以它内部会做通道顺序的变化,传入为BGR转换为RGB,所以你如果传入RGB显示的就是BGR了。废话说完了,看代码。

以下是测试代码
运行环境为windows10+python3.6

#encoding=utf8
from PIL import Image
import numpy as np
import cv2
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import skimage
import sys
from skimage import io #PIL
#相关:scipy.misc.imread, scipy.ndimage.imread
#misc.imread 提供可选参数mode,但本质上是调用PIL,具体的模式可以去看srccode或者document
#https://github.com/scipy/scipy/blob/v0.17.1/scipy/misc/pilutil.py
imagepath='test1.jpg'
im1=Image.open(imagepath)
im1=np.array(im1)#获得numpy对象,RGB
print(type(im1))
print(im1.shape)#2 opencv
im2=cv2.imread(imagepath)
print(type(im2))#numpy BGR
print(im2.shape)#[width,height,3]#3 matplotlib 类似matlab的方式
im3 = mpimg.imread(imagepath)
print(type(im3))#np.array
print(im3.shape)#4 skimge
#caffe.io.load_iamge()也是调用的skimage实现的,返回的是0-1 float型数据
im4 = io.imread(imagepath)
print(type(im4))#np.array
print(im4.shape)
#print(im4)# cv2.imshow('test',im4)
# cv2.waitKey()
#统一使用plt进行显示,不管是plt还是cv2.imshow,在python中只认numpy.array,但是由于cv2.imread 的图片是BGR,cv2.imshow 时相应的换通道显示
plt.subplot(221)
plt.title('PIL read')
plt.imshow(im1)
plt.subplot(222)
plt.title('opencv read')
plt.imshow(im2)
plt.subplot(223)
plt.title('matplotlib read')
plt.imshow(im3)
plt.subplot(224)
plt.title('skimage read')
plt.imshow(im4)
#plt.axis('off') # 不显示坐标轴
plt.show()##################################### cmd output################################
# <class 'numpy.ndarray'>
# (851, 1279, 3)
# <class 'numpy.ndarray'>
# (851, 1279, 3)
# <class 'numpy.ndarray'>
# (851, 1279, 3)
# <class 'numpy.ndarray'>
# (851, 1279, 3)

测试结果


总结
虽然python中没有显示的数据类型声明,但是在编程的过程中自己必须得清楚数据类型是什么,否则就有可能犯一些愚蠢的错误。
--------------------- 
作者:renelian1572 
来源:CSDN 
原文:https://blog.csdn.net/renelian1572/article/details/78761278 
版权声明:本文为博主原创文章,转载请附上博文链接!

Python 中各种imread函数的区别与联系相关推荐

  1. python中imread用法_【转载】Python 中各种imread函数的区别与联系

    Python 中各种imread函数的区别与联系 最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误.如 ...

  2. python中imread什么意思_Python 中各种imread函数的区别与联系

    Python 中各种imread函数的区别与联系 最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误.如 ...

  3. python中变量和函数的区别_关于python中带下划线的变量和函数 的意义

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  4. python中变量和函数的区别_python中带下划线的变量和函数的意义

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  5. Python中cv2.imread()函数不能读中文文件名文件

    cv2.imread读取中文文件名 将 image = cv2.imread(image_file) 替换为: image = cv2.imdecode(np.fromfile(image_file, ...

  6. python中search和match的区别_Python中正则表达式match()、search()函数及match()和search()的区别详解...

    match()和search()都是python中的正则匹配函数,那这两个函数有何区别呢? match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找 ...

  7. Python中的print函数及其中单引号双引号区别

    一,Python中的print函数 Python中print函数用法: print("hello world!") hello world! print(5+8) 13 print ...

  8. python中bytearray和java中byte[]的区别_Python经典面试题:说说Python中xrange和range的区别?...

    昨晚一小伙后台问xrange和range有啥区别,讲了下他倒领悟的挺快,其实这也是你各面试Python岗位,经常会遇到的Python面试题,长个心眼哈,说不定明年3月你找工作就用上了. 废话不多说,开 ...

  9. python有关迭代器和生成器的面试题_【面试题 | Python中迭代器和生成器的区别?】- 环球网校...

    [摘要]今天给大家解答一道Python常见的面试题,希望这个面试栏目,给那些准备面试的同学,提供一点点帮助!小编会从最基础的面试题开始,每天一题.如果参考答案不够好,或者有错误的话,麻烦大家可以在留言 ...

最新文章

  1. retinaface极坐标
  2. LeetCode-字符串-58. 最后一个单词的长度
  3. SQL Server 行转列,列转行。多行转成一列
  4. 音视频技术开发周刊 | 150
  5. C++数组参数应用方式探讨(转)
  6. 第一百三十三期:MySQL锁会不会,你就差看一看咯
  7. RabbitMQ 普通集群配置_04
  8. ajax判断网络中断,如何检测由于网络Ajax调用失败断开
  9. ofo 回应甩卖办公桌;华为与袁隆平合作;罗永浩 1 亿股权遭冻结 | 极客头条
  10. Android--UI控件
  11. android.jar 重新编译,android的framework.jar反编译,并重新编译
  12. 经典网络DenseNet介绍
  13. 2017计算机知识竞赛题,2017网络安全知识竞赛题库(中学组)word版
  14. thinkpad e450c蓝牙重新安装后不能搜索到手机解决方案--适用大部分笔记本
  15. Python数学问题16:百钱买百鸡
  16. 在浏览器端浏览EPUB
  17. Elasticsearch CCR源码分析(补充)
  18. GLES2.0中文API-glTexImage2D
  19. 为什么感觉期货交易越做越难?
  20. 晨枫U盘维护工具的ISOLINUX模式可加载磁盘映像的探索及USB-ROM引导后安装系统的相关问题

热门文章

  1. boost::type_erasure::binding相关的测试程序
  2. boost::fusion::count用法的测试程序
  3. boost::container模块实现基本分配的测试程序
  4. VTK:模型之MarchingSquares
  5. VTK:图片之ImageStack
  6. OpenCV纠正文本中的偏斜(附完整代码)
  7. OpenCV神经网络neural network的实例(附完整代码)
  8. OpenCV纹理对象的实时姿态估计
  9. C语言求两个链表的合并点的算法(附完整源码)
  10. C语言中基本的不平衡二进制搜索树实现(附完整源码)