Python 中各種imread函式的區別與聯絡

2021-08-13 07:08:08 字數 3147 閱讀 7621

最近一直在用python做影象處理相關的東西,被各種imread函式搞得很頭疼,因此今天決定將這些imread總結一下,以免以後因此犯些愚蠢的錯誤。如果你正好也對此感到困惑可以看下這篇總結。當然,要了解具體的細節,還是應該 read the **** code和api 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

npimport

cv2import

matplotlib.pyplot as

plt # plt 用於顯示

import

matplotlib.image as

mpimg # mpimg 用於讀取

import

skimage

import

sysfrom

skimage import

io #pil

#相關:scipy.misc.imread, scipy.ndimage.imread

#misc.imread 提供可選引數mode,但本質上是呼叫pil,具體的模式可以去看srccode或者document

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') # 不顯示座標軸

雖然python中沒有顯示的資料型別宣告,但是在程式設計的過程中自己必須得清楚資料型別是什麼,否則就有可能犯一些愚蠢的錯誤。

python中各種轉義字元

空白總是美好的,而我們總是困惑 t時前面到底有多少空白,接下來讓我們來仔細了解一下 在控制台輸出資料的時候,也就是用printf 的時候,我們經常用 t來控制對齊,以使輸出的結果更加整齊美觀。然而有時候我們發現及時使用了 t 也會出現資料對不齊的情況,這就跟 t究竟對應幾個空格有關係。先給出程式和執...

python中 的各種問題

今天sololearn和shubham打了一局輸在了這個題上 其實 數字a 數字b 數字c 就是一種比較方便的訪問形式 主要適合list str也是可以的 其實大部分狀態下都是預設的,例如下面這段 c 1,2,3,4,5,6 print c 1 3 答案就是輸出c的第乙個和第二個數字,2,3 如果加...

python中的各種符號

在這裡所作的是將所有的 python 符號和關鍵字列出來,這些都是值得掌握的重點。關鍵字 and del from not while as elif global or with assert else if pass yield break except import print class e...