Python各種圖像庫的圖像的基本讀寫方式


目前主流的圖像庫有幾下幾種:

1. OpenCV      2. PIL(Pillow)       3. matplotlib.image     4. skimage      5. scipy.misc

結論:以上圖片庫中當屬OpenCV最為強大,成熟。

 

1.1 OpenCV 圖像的讀取與儲存

import cv2
#讀取圖像 直接是numpy矩陣格式
img = cv2.imread('horse.jpg',1) # 0表示讀入灰色圖片,1表示讀入彩色圖片
cv2.imshow('image',img) # 顯示圖像
print(img.shape)   # (height,width,channel)
print(img.size)    # 像素數量
print(img.dtype)   # 數據類型
print(img)         # 打印圖像的numpy數組,3緯數組

#儲存圖像
# 當前目錄儲存
cv2.write(‘horse1.jpg',img)
# 自定義儲存
cv2.write(‘/path_name/’ + str(image_name) + '.jpg',img)
          
cv2.waitKey()

1.2OpenCV 圖像灰化處理

import cv2
#方法一
img = cv2.imread('horse.jpg',0) # 0表示讀入灰色圖片,或者使用cv2.IMREAD_GRATSCALE 替代0
cv2.imshow('gray image',img)

#方法二
img = cv2.imread('horse.jpg')
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray image',gray_img)

print(gray_img.shape) # (height, width)
print(gray_img.size)  # 像素數量
print(gray_img)       # 打印圖像的numpy數組,2維
cv2.waitKey()

1.3 OpenCV 矩陣格式變換

Why?:OpenCV的矩陣格式 (height, width, channels) -->> 深度學習矩陣類型可能是 (channels,height,width)

import cv2
import numpy as np
img = cv2.imread('horse.jpg',1)
cv2.imshow('image',img)
# 矩陣格式的變換
print(img.shape)
img = img.transpose(2,0,1) #變換函數 
print(img.shape)
# 矩陣擴展 (batch_size, channels, height, width) 預測單張圖片的操作
# 加一列作為圖片的個數
img = np.expand_dims(img, axis=0) #使用numpy函數
print(img.shape)
# 訓練階段構建batch
data_lst = []
loop:
    img = cv2.imread('xxx.jpg')
    data_lst.append(img)
data_arr = np.array(data_lst)

1.4 OpenCV 圖片歸一化 (Data Normalization)

import cv2
# 為了減少計算量,需要把像素值0-255轉換到0-1之間
img = cv2.imread('horse.jpg')
img = img.astype('float') / 255.0 # 先轉化數據類型為float
print(img.dtype)
print(img)

1.5 OpenCV BRG轉換為RGB

import cv2
img = cv2.imread('horse.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) # 轉為RGB format
print(img)

1.6 OpenCV 訪問像素點

import cv2
img = cv2.imread('horse.jpg')
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 轉為Gray image
print(img[4,4])        # 3 channels
print(gray_img[4,4])   # 1 channel

1.7 OpenCV 感興趣區域剪切(ROI)

import cv2
img = cv2.imread('horse.jpg')
print(img.shape)
roi = img[0:437,0:400] # [y:height,x:width]

cv2.imshow('roi',roi)
cv2.waitKey()

 

 

2.1 PIL 圖像讀取與儲存

from PIL import Image
import numpy as np
#圖像讀取
img = Image.open('horse.jpg')
print(img.format) # 圖片格式
print(img.size)   # (width,height)
print(img.mode)   # 圖片通道類型

#將圖像轉化為矩陣格式
arr = np.array(img)
print(arr.shape)
print(arr.dtype)

#圖像儲存
new_img = Image.fromarray(arr)
new_img.save('test.jpg')

img.show()

2.2 PIL 圖像灰化處理 

#圖像灰化處理
gray = Image.open('horse.jpg').convert('L')
gray_arr = np.array(gray)
print(gray_arr.shape) # (height,width)
print(gray_arr.dtype)
print(gray_arr)
gray.show()

2.3 PIL 感興趣區域剪切

# 感興趣區域剪切
img = Image.open('horse.jpg')
roi = img.crop((0,0,200,200)) # (左上x,左上y,右下x,右下y)
roi.show()

2.4 通道操作

# 通道處理
r,g,b = img.split() #分離
img = Image.merge("RGB",(b,g,r)) #合並
img = img.copy() #復制

 

3.1 Matplotlib 讀取和存儲圖片

import matplotlib.pyplot as plt
import numpy as np
# 圖像讀取為numpy數組格式
img = plt.imread('horse.jpg')

plt.axis('off') # 關閉刻度顯示

print(img.shape) # (height, width, channel)
print(img.size) # 像素數量
print(img.dtype)

#儲存圖片
plt.savefig('./name.jpg')

figure = plt.figure(figsize=(20,10)) # 調整顯示圖片的大小

plt.imshow(img)
plt.show()

3.2 Matplotlib 圖片灰化處理

#圖片灰化處理
# 平均值發
img_mean = img.mean(axis=2)
plt.imshow(img_mean,cmap='gray')
plt.show()

#最大值法
img_max = img.max(axis=-1)
plt.imshow(img_max,cmap='gray')
plt.show()

#RGB三原色法
gravity = np.array([0.299,0.587,0.114])
img_gravity = np.dot(img,gravity)
plt.imshow(img_gravity,cmap="gray")
plt.show()

 

4.1 skimage 讀取和儲存圖像

from skimage import io
#讀取圖像numpy數組格式
img = io.imread('horse.jpg')
print(img.shape)
print(img.dtype)
print(img.size)
#print(img)
io.imshow(img)

#儲存圖像
io.imsave('test.jpg',img)

4.2 skimage 灰化處理

#圖像灰化處理並歸一化
img = io.imread('horse.jpg',as_gray=True)
print(img.shape)
print(img.dtype) # 數據類型位float
print(img.size)
print(img)
io.imshow(img)
io.show()

 

5.1 scipy.misc 讀取和儲存圖像

#在1.2.0 之后統一用imageio模塊
import imageio
import matplotlib.pyplot as plt
#讀取圖片為numpy數組
img = imageio.imread('horse.jpg')
print(img.dtype)
print(img.size)  # 像素數量
print(img.shape) #(height, width, channels)
plt.imshow(img)
plt.show()
print(img)
#儲存圖片
imageio.imsave('test.jpg',img)

 

未完待續......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM