日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2024/9/21 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 中各种imread函数的区别与联系 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python 中各種imread函數(shù)的區(qū)別與聯(lián)系
最近一直在用python做圖像處理相關(guān)的東西,被各種imread函數(shù)搞得很頭疼,因此今天決定將這些imread總結(jié)一下,以免以后因此犯些愚蠢的錯誤。如果你正好也對此感到困惑可以看下這篇總結(jié)。當(dāng)然,要了解具體的細(xì)節(jié),還是應(yīng)該 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函數(shù)在實現(xiàn)方式和讀取速度上有何區(qū)別?
這些方法可以分為四大家族
PIL

PIL.Image.open + numpy scipy.misc.imread scipy.ndimage.imread這些方法都是通過調(diào)用PIL.Image.open 讀取圖像的信息; PIL.Image.open 不直接返回numpy對象,可以用numpy提供的函數(shù)進(jìn)行轉(zhuǎn)換,參考Image和Ndarray互相轉(zhuǎn)換; 其他模塊都直接返回numpy.ndarray對象,通道順序為RGB,通道值得默認(rèn)范圍為0-255

Image與Ndarray互相轉(zhuǎn)換

matplotlib
matplot.image.imread

從名字中可以看出這個模塊是具有matlab風(fēng)格的,直接返回numpy.ndarray格式通道順序是RGB,通道值默認(rèn)范圍0-255。

opencv
cv2.imread

使用opencv讀取圖像,直接返回numpy.ndarray 對象,通道順序為BGR ,注意是BGR,通道值默認(rèn)范圍0-255。

skimage
skimage.io.imread: 直接返回numpy.ndarray 對象,通道順序為RGB,通道值默認(rèn)范圍0-255。?
caffe.io.load_image: 沒有調(diào)用默認(rèn)的skimage.io.imread,返回值為0-1的float型數(shù)據(jù),通道順序為RGB

關(guān)于圖像的一些說明
可以使用matplotlib的pyplot模塊的show也可以使用cv2的imshow方法,對于這些方法只要你傳入的參數(shù)是numpy.ndarray(通道值范圍0-255) 就可以正常顯示,不存在區(qū)別,這也可以看出numpy在python中的重要地位;但是cv2.imshow方法由于它針對的是cv2的imread 所以它內(nèi)部會做通道順序的變化,傳入為BGR轉(zhuǎn)換為RGB,所以你如果傳入RGB顯示的就是BGR了。廢話說完了,看代碼。

以下是測試代碼
運行環(huán)境為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 #相關(guān):scipy.misc.imread, scipy.ndimage.imread #misc.imread 提供可選參數(shù)mode,但本質(zhì)上是調(diào)用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()也是調(diào)用的skimage實現(xiàn)的,返回的是0-1 float型數(shù)據(jù) im4 = io.imread(imagepath) print(type(im4))#np.array print(im4.shape) #print(im4)# cv2.imshow('test',im4) # cv2.waitKey() #統(tǒng)一使用plt進(jìn)行顯示,不管是plt還是cv2.imshow,在python中只認(rèn)numpy.array,但是由于cv2.imread 的圖片是BGR,cv2.imshow 時相應(yīng)的換通道顯示 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') # 不顯示坐標(biāo)軸 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)

測試結(jié)果


總結(jié)
雖然python中沒有顯示的數(shù)據(jù)類型聲明,但是在編程的過程中自己必須得清楚數(shù)據(jù)類型是什么,否則就有可能犯一些愚蠢的錯誤。
---------------------?
作者:renelian1572?
來源:CSDN?
原文:https://blog.csdn.net/renelian1572/article/details/78761278?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

總結(jié)

以上是生活随笔為你收集整理的Python 中各种imread函数的区别与联系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。