• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python imread函数详解

    Python 中各种imread函数的区别与联系

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

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

    这些方法可以分为四大家族

    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################################
    # 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中没有显示的数据类型声明,但是在编程的过程中自己必须得清楚数据类型是什么,否则就有可能犯一些愚蠢的错误。

    到此这篇关于python imread函数详解的文章就介绍到这了,更多相关python imread函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
    • Python中使用pprint函数进行格式化输出的教程
    • python中re.findall函数实例用法
    • Python函数基础
    • Python torch.flatten()函数案例详解
    • Python之基础函数案例详解
    • Python 函数简单易理解版
    • python机器学习高数篇之函数极限与导数
    • python中super()函数的理解与基本使用
    • Python如何使用print()函数输出格式化字符串
    • python中map()函数使用方法详解
    • python之多种方式传递函数方法案例讲解
    • Python类的高级函数详解
    • 10个有用的Python字符串函数小结
    • 关于Python OS模块常用文件/目录函数详解
    • python用函数创造字典的实例讲解
    • Python常见的函数及格式化输出
    上一篇:Python基于React-Dropzone实现上传组件的示例代码
    下一篇:Numpy数组的组合与分割实现的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python imread函数详解 python,imread,函数,详解,python,