python中imread用法_【转载】Python 中各种imread函数的区别与联系
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。
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################################
#
# (851, 1279, 3)
#
# (851, 1279, 3)
#
# (851, 1279, 3)
#
# (851, 1279, 3)
测试结果
总结
虽然python中没有显示的数据类型声明,但是在编程的过程中自己必须得清楚数据类型是什么,否则就有可能犯一些愚蠢的错误。
---------------------
作者:renelian1572
python中imread用法_【转载】Python 中各种imread函数的区别与联系相关推荐
- python模块的发布_(转载)Python中模块的发布与安装
模块(Module) Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个 ...
- python网格搜索核函数_(转载)Python机器学习笔记GridSearchCV(网格搜索)
转载声明 介绍 在机器学习模型中,需要人工选择的参数称为超参数.比如随机森林中决策树的个数,人工神经网络模型中隐藏层层数和每层的节点个数,正则项中常数大小等等,他们都需要事先指定.超参数选择不恰当,就 ...
- python delimiter分隔符用法_使用Python文件读写,自定义分隔符(custom delimiter)
众所周知,python文件读取文件的时候所支持的newlines(即换行符),是指定的.这一点不管是从python的doucuments上还是在python的源码中(作者是参考了python的io版本 ...
- mysql中gt用法_讲解MySQL中lt;=gt;操作符的用法-一团网
问题 : 我在看以前的一个开发者的代码时看到 在这个查询语句中 <=>符号是什么意思啊?是不是和 =号是一样啊?还是一个语法错误啊?但是没有显示任何错误或者异常.我已经知道了mysql中的 ...
- python中len用法_【python】python中len()怎么用-百度经验
本文,介绍一下python中len()函数的用法. 工具/原料 电脑 python3.6(Anaconda) 方法/步骤 1 len函数的作用,是Return the number of items ...
- python的property用法_在python中property怎样使用-百度经验
在python中property可以使类中的方法变为类中的属性一样来使用,使得类中的属性值不易暴露,更加安全,那么在python中property怎样使用呢?下面小编就带大家来看看详细的教程! 工具/ ...
- lambda在python中的用法_在python中对lambda使用.assign()方法
我在Python中运行以下代码:#Declaring these now for later use in the plots TOP_CAP_TITLE = 'Top 10 market capit ...
- python中globals用法_在Python中使用globals()的原因?
在"声明性python"中很有用. 例如,在下面的globals()和globals()中,是用于定义一系列数据结构的类,这些数据结构随后将被某些程序包用作其输入或配置. 这使您可 ...
- python正则表达式group用法_【Python】正则表达式用法
导读:正则在各语言中的使用是有差异的,本文以 Python 3 为基础.本文主要讲述的是正则的语法,对于 re 模块不做过多描述,只会对一些特殊地方做提示. 很多人觉得正则很难,在我看来,这些人一定是 ...
- python类高级用法_十.python面向对象高级用法
1.反射 1.1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的 ...
最新文章
- dubbo接口测试_Django测试工具平台之Dubbo接口请求 + 前端
- 2019年六大新兴信息安全方向
- 日期和时间规范函数 (Entity SQL)
- MSP430F5529 DriverLib 库函数学习笔记(七)定时器B
- Linux学习第三步(Centos7安装mysql5.7数据库)
- JS-原型-原型链-值和引用类型
- 学习笔记===《用户体验要素——以用户为中心的产品设计》
- python画超长图-利用Python画图,千变万化,各种画图技巧!
- android某个界面横屏,iOS强制某个界面横屏的方法
- Android studio3.5读取项目资源文件的图片
- 仓库管理数据库系统设计
- 中值滤波_中值滤波原理
- postgresql批量插入数据脚本_asp.net实现Postgresql快速写入/读取大量数据实例
- 从事java开发工作三年的感想
- 全球与中国线锯钢线市场深度研究分析报告
- 对i++,i--,++i,--i深刻认识以及printf()函数打印的过程
- 使用RXTX实现简单串口通信调试工具
- Java-多线程的使用
- 志高扫地机器人好用吗_扫地机器人哪个好用?这几款用过的人都有很高的评价...
- CORE-ESP32C3|eink|日期格式化|IO11解锁|墨水屏操作库|SNTP自动同步|局部刷新|全局刷新|LuatOS-SOC接口|官方demo|学习(12):简单日期显示
热门文章
- leetcode 708 剑指 Offer II 029. 排序的循环链表 python
- matlab的findpeaks函数使用方法介绍
- 基于Istio Ingress对外提供服务
- 如何考取 AWS 技术认证
- python你好世界代码大全_Python菜鸟入阶第二步(编写hello world小程序)
- 8.6 竞赛题目选讲
- ES:Too many open files in system
- 管理类联考——英语——趣味篇——词根词汇——按频次分类——高频词汇——List1
- c语言课程教学团队介绍,计算机科学技术系计算机基础课程教学团队简介
- python用缩进来标明代码的层次关系_Python第二弹python基础