生活随笔
收集整理的這篇文章主要介紹了
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
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函数的区别与联系的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。