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中没有显示的数据类型声明,但是在编程的过程中自己必须得清楚数据类型是什么,否则就有可能犯一些愚蠢的错误。
python中imread什么意思_Python 中各种imread函数的区别与联系相关推荐
- C语言中的带参宏和带参函数的区别
C语言中的带参宏和带参函数的区别 (1) 带参函数中的形参是变量,因此有类型检查.而带参宏只是简单的字符串替换. (2) 从程序执行的过程来看,带参宏是在预处理阶段被预处理器处理的.而带参函数是在程序 ...
- python列表怎么写文件_python中以字典为元素的列表怎么写入文本文件
python如何将列表中的元素添加进字典纵然被命运的铁蹄狠狠践踏,也顽强地长出自己的根芽. 录入自己和另一个人的名字的汉语拼音简写,然后依据标识符中字母的数值两个人,一颗心,依偎的不是爱情而是那小温暖 ...
- python中赋值语句的作用_python中return可以使用赋值语句吗?
在python中,有各种不同类型的语句.一个python程序是由模块构成的;一个模块由一条或多条语句组成;每个语句由不同的表达式组成;表达式可以创建和操作对象.下面来看看python中的语句. 赋值语 ...
- python整数和浮点数相乘_python中整数除法和浮点数到整数转换之间的区别是什么原因?...
我要说的是,您的观察表明这两个操作应该在直观上相似,因为在正数上它们的行为相同.但是,如果您查看它们的起源(一个来自数学,另一个来自计算机科学),那么它们的不同行为更有意义. 您可以在其中查看概念: ...
- python里的join方法_python中join()方法介绍
描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str . join ( sequence ) 参数 sequence -- ...
- python 局部变量 占内存吗_Python中全局变量和局部变量的理解与区别
前言 学过编程的人应该对全局变量与局部变量这两个名词并不陌生,Python也同多数编程语言一样,也有全局变量与局部变量的概念 但是与其他编程语言又有所不同 全局变量与局部变量两者的本质区别就是在于作用 ...
- python中split啥意思_python中split的用法详解_后端开发
如何用python正则表达式匹配字符串?_后端开发 用python正则表达式匹配字符串的方法:1.当匹配单个位置的字符串时,可以使用[(.+?)]正则表达式来提取:2.当连续多个位置的字符串匹配时,可 ...
- python中importlib模块安装_Python中标准模块importlib详解
Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外 ...
- python中的元类_Python中的元类(metaclass)
提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自身有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理 ...
最新文章
- 【组队学习】【30期】7. CV中的Transformer
- 计算机网络协议分层体系结构
- oracle 关于日期格式转换与使用
- NetBeans IDE 实现php开发自动上传到开发服务器 的设置
- 转载-程序员编程技术迅速提高的终极攻略
- 大数——大数阶乘(hdu1042)
- 《TensorFlow:实战Google深度学习框架》——5.3 TensorFlow中的变量初始化函数
- Oracle Cluster Health Monitor(CHM)简介
- 解决pandas索引报错Unalignable boolean Series provided as indexer
- php 支持泛型,PHP对Java样式类的泛型有答案吗?
- 台安PLC通过手机热点远程在线模拟,远程编程,远程调试
- 用html做一个漂亮的网站,个人网页,css
- raw 图像转成fits格式图像
- 通过bat文件加密文件夹,放入你的秘密小电影
- SpringBoot集成flyway、mybatis-plus(超详细)
- Gym101635C Macarons
- 汉堡包菜单_神圣的汉堡包!
- 软件工程——形式化方法概述
- 十六宫格拼图(A*/IDA*)(曼哈顿距离)
- oracle 查询调用某一存储过程的job,oracle job 调用存储过程的使用
热门文章
- Samsung/三星I847(Rugby Smart) root教程_方法
- 《那些年,我们一起追的女孩》:他们台湾那些年
- python爬虫用什么电脑好_【Python】【爬虫】最近想买电脑,用Python爬取京东评论做个参考...
- 给你的笔记本电脑装上高性能独立显卡:外接显卡盒子选购指南
- matlab软件的功能介绍
- Android学习笔记-常用的一些源码,防止忘记了
- android系统佳明app,佳明garmin手表
- 身份证、姓名、手机号、地址、邮箱脱敏处理
- 练习-Java分支结构综合练习二之物流运费计算
- 硬盘分区损坏后数据恢复方法[分区恢复,分区修复,分区丢失,数据恢复,数据丢失,数据修复]