1. 程式人生 > >Python中讀取,顯示,儲存圖片的方法

Python中讀取,顯示,儲存圖片的方法

Python中操作影象的方法包括opencv,matplotlib,PIL。

(一) opencv:

import cv2 as cv
# load 
img = cv.imread(imagepath)
# shape=(height, width, channel)
h,w,c = img.shape
# show
cv.imshow('window_title', img)
# save
cv.imwrite(savepath, img)

(二) matplotlib:

import matplotlib.pyplot as plt # plt 用於顯示圖片
import matplotlib.image as mpimg # mpimg 用於讀取圖片
import numpy as np

# load
img = mpimg.imread('cat.jpg') 
# 此時 img 就已經是一個 np.array 了,可以對它進行任意處理
# height, width, channel=(360, 480, 3)
h,w,c = img.shape 

# show
plt.imshow(img) # 顯示圖片
plt.axis('off') # 不顯示座標軸
plt.show()

# save
# 適用於儲存任何 matplotlib 畫出的影象,相當於一個 screencapture
plt.savefig('fig_cat.png')

注意到:

  • plt.imshow(image)中的圖片的資料型別可以使np.array型別
  • mpimg 既提供了載入影象函式imread,又提供了儲存影象函式imsave
  • plt.savefig函式 可以將顯示在fig中影象儲存下來

matplotlib 擴充套件:1.影象縮放、顯示

from scipy import misc
# 第二個引數如果是整數,則為百分比,如果是tuple,則為輸出影象的尺寸
lena_new_sz = misc.imresize(img, 0.5) 
plt.imshow(img_new_sz)
plt.axis('off')
plt.show()

matplotlib 擴充套件:2. 將np.array儲存為影象、直接儲存np.array

# 2.1 np.array=>image file
from scipy import misc
misc.imsave('img_new_sz.png', img_new_sz)
"""
from scipy import misc
# load image
lena = misc.imread('lena.png')
# <type 'numpy.ndarray'>
type(lena) 
# lena.shape, lena.dtype
"""

# 2.2 np.array=>np data file
import numpy as np
np.save('img_new_sz', img_new_sz) # 會在儲存的名字後面自動加上.npy
img = np.load('img_new_sz.npy') # 讀取前面儲存的陣列

注意: np.array資料可以通過np.save函式直接儲存在磁碟上,副檔名為.npy, 通過np.load函式直接恢復; scipy.misc提供了對numpy.array格式影象的處理函式,特別是misc.imsave函式可以直接將np.array資料儲存成影象檔案。

(三) PLT:

載入並顯示影象(part 1)

from PIL import Image
# load
im = Image.open('cat.jpg')

# show
im.show()

# 返回 image's size w,h = (480, 360)
w,h = img.size

# PIL.JpegImagePlugin.JpegImageFile
type(img)

# 直接呼叫Image類的save方法
img.save('new_cat.png')

載入並顯示影象(part 2)

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('/home/wanghao/Pictures/001.jpg')
plt.figure("head")
plt.imshow(img)
plt.show()

PIL圖片和numpy陣列間的轉換

"""
# PIL Image => np.array
# 也可以用 np.asarray(im),區別是 
# np.array() 是深拷貝,np.asarray() 是淺拷貝
"""
im_array = np.array(im)

"""
這裡採用 matplotlib.image 讀入圖片陣列
注意: 
這裡讀入的陣列是 float32 型的,範圍是 0-1;
PIL.Image 資料是 uinit8 型的,範圍是0-255,所以要進行轉換;
"""
import matplotlib.image as mpimg
from PIL import Image
img = mpimg.imread('cat.jpg') # 這裡讀入的資料是 float32 型的,範圍是0-1
# 方法轉換之後顯示效果不好
img = Image.fromarray(np.uint8(img*255))
img.show()

注意: numpy轉PIL Image後顯示效果很差,不如 轉成numpy後使用matplotlib顯示好

參考: