1. 程式人生 > >Python的影象庫(Opencv、PIL、matplotlib、skimage)的使用(讀取、儲存、變換、濾波)

Python的影象庫(Opencv、PIL、matplotlib、skimage)的使用(讀取、儲存、變換、濾波)

Python的影象庫(Opencv、PIL、matplotlib、skimage)的使用

Opencv

OpenCV的全稱是:Open Source Computer Vision Library。OpenCV是一個基於(開源)發行的跨平臺計算機視覺庫,可以執行在Linux、Windows和Mac OS作業系統上。它輕量級而且高效——由一系列 C 函式和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的介面,實現了影象處理和計算機視覺方面的很多通用演算法。

讀取操作

注意: cv2讀取的圖片通道使按B、G、R排列的,而非RGB順序。因此工程中opencv庫與其他庫混用時要注意,可以用img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)轉化為RGB通道。

基本讀取操作

import cv2 
img = cv2.imread('image.jpg') #可讀取tif格式影象
if img == None:               #判斷影象是否存在
	print ('This file may not be available') 
cv2.imshow('the window name',img)
cv2.waitKey(
)#在imshow之後如果沒有waitKey語句則不會正常顯示影象。 CV2.imwrite('new_image.jpg',img)

img numpy陣列矩陣;img.shape 獲取影象的(高,寬,通道數);img.size影象的畫素點數;img.dtype影象的資料型別(uint8)。

灰度圖讀取

gray = cv2.imread('image.jpg',cv2.IMREAD_GRAYSCALE) #cv2.IMREAD_UNCHANGED 包含alpha通道(透明度)
#使用顏色轉換函式cv2.cvtColor
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

通道操作

b,g,r = cv2.split(img) #通道分離
merge_img = cv2.merge((b,g,r))

ROI操作

#陣列的切片操作
roi = img[100:300,30:350,:]

影象處理

縮放與旋轉

#縮放
img_resize = cv2.resize(img,(h,w)) #w,寬;h,高
#旋轉 opencv中目前沒有現成函式直接用來影象旋轉,是用仿射變換函式warpAffine來實現的。
#cv2.getRotationMatrix2D() 引數1:旋轉中心點;引數2:旋轉角度;引數3:縮放大小。輸出:旋轉矩陣
Matrix = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
img_rotate = cv2.warpAffine(img,MMatrix,(cols,rows))
#翻轉cv2.flip(img,filpcode)
img_filp=cv2.flip(img,0) #0:-垂直翻轉
img_filp=cv2.flip(img,1) #1:-水平翻轉
img_filp=cv2.flip(img,-1) #負值:-垂直+水平翻轉

影象濾波

對影象進行濾波,可以有兩種效果:一種是平滑濾波,用來抑制噪聲;另一種是微分運算元,可用來檢測邊緣和特徵提取。

#中值濾波
img_medianBlur=cv2.medianBlur(img,5)
#均值濾波
img_Blur=cv2.blur(img,(5,5))
#高斯濾波
img_GaussianBlur=cv2.GaussianBlur(img,(7,7),0) 

PIL

PIL(Python Imaging Library),即Pillow,相比opencv更為輕巧。Image模組是在Python PIL影象處理中常見的模組,對影象進行基礎操作的功能基本都包含於此模組內。如open、save、show等功能。

讀取操作

PIL讀取圖片獲得的不是矩陣,而是Image格式,可以利用numpy進行轉化。

基本讀取操作

from PIL import Image
import numpy as np
#讀取影象
img = Image.open('image.jpg') #可以讀取tif格式圖片
img.show()              #顯示影象
img_arr = np.array(img) #3維矩陣
#儲存影象
new_img = Image.fromarray(img_arr)
new_img.save('newimage.jpg') #如果不轉矩陣可直接用'.save'儲存

img.format 影象格式;img.mode 影象型別,L為灰度圖,RGB為真彩色,RGBA含有透明度通道。
注意: img.size返回的是影象的寬高(w,h),不包含通道;而opencv與matplotlib中返回的是影象的畫素總數。

灰度圖讀取

gary = Image.open('image.jpg').convert('L')

通道操作

#通道的分離合並
r,g,b = img.split()
img = Image.merge('RGB',(r,g,b))
#複製影象
img_copy = img.copy()

ROI獲取

roi = img.crop((200,300,400,500))# (左、上、右、下)即左上角和右下角畫素點的座標'x'與'y'

影象處理

縮放與旋轉

#縮放
img_resize = img.resize((h,w))
#旋轉
img_r90 = img.rotate(90) #旋轉90度
img_transpose_tb = img.transpose(Image.FLIP_TOP_BOTTOM)#上下翻轉
img_transpose_lr = img.transpose(Image.FLIP_LEFT_RIGHT)#左右翻轉

影象增強

PIL的ImageEnhance類專門用於影象增強處理,可以增強(減弱)影象的亮度、對比度、色度、以及銳度。

from PIL import Image
from PIL import ImageEnhance

#原始影象
img = Image.open('image.jpg')
#亮度增強
img_bright = ImageEnhance.Brightness(imag)
brightness = 3
image_brighted = img_bright.enhance(brightness)
image_brighted.show()
#色度增強
img_color = ImageEnhance.Color(img)
color = 2
image_colored = img_color.enhance(color)
image_colored.show()
#對比度增強
img_contrast = ImageEnhance.Contrast(img)
contrast = 3
image_contrasted = img_contrast.enhance(contrast)
image_contrasted.show()
#銳度增強
img_sharp = ImageEnhance.Sharpness(img)
sharpness = 2
image_sharped = img_sharp.enhance(sharpness)
image_sharped.show()

影象濾波

由PIL中的ImageFilter類實現。

from PIL import ImageFilter
#模糊濾波
img_blur = img.filter(ImageFilter.BLUR)
#輪廓濾波
img_contour = img.filter(ImageFilter.CONTOUR)
#細節濾波
img_detail = img.filter(ImageFilter.DETAIL)
#邊界增強濾波
img_edge_enhance = img.filter(ImageFilter.EDGE_ENHANCE)
#銳化濾波
img_sharp = img.filter(ImageFilter.SHARPEN)
#高斯模糊濾波
img_gauss = img.filter(ImageFilter.GaussianBlur(radius=2))  # radius指定平滑半徑,也就是模糊的程度。

matplotlib

Matplotlib是一個Python 2D繪相簿,它可以在不同的平臺上以各種硬拷貝格式和互動環境生成釋出質量資料。Matplotlib可以用於Python指令碼、Python和IPython shell、Jupyter notebook、web應用伺服器和四個圖形使用者介面工具包。對於簡單的繪圖,pyplot模組提供了一個類似於matlab的介面,特別是與IPython結合使用時。對於power使用者,您可以通過面向物件的介面或通過MATLAB使用者熟悉的一組函式來完全控制線樣式、字型屬性、軸屬性等.

影象讀取

基本讀取操作

import matplotlib.pyplot as plt
import numpy as np 

img  = plt.imread('image.jpg') #可以讀取tif檔案
plt.imshow(img) 
#plt.axis('off')  #關閉座標軸上的數字
plt.show()
plt.savefig('new_img.jpg')

灰度圖

img_r = img[:,:,0] #取單通道-r通道
plt.imshow(img_r)
plt.show()

輸出影象示例:
原始影象單通道不帶引數

輸出並不是灰度圖,得到灰度圖需要新增cmap = 'Greys_r' 引數

plt.imshow(img_r,cmap='Greys_r')
plt.show()

灰度圖:
在這裡插入圖片描述

skimage

scikit-image是一組用於影象處理和計算機視覺的演算法。“skimage”的主要包只提供了一些用於轉換影象資料型別的實用程式;大多數功能程式存在其子包中。讀取功能包含在io模組中。

讀取操作

基本讀取操作

from skimage import io

img = io.imread('image.jpg') #不能讀取tif格式影象  
io.imshow(img)
io.show() 
io.imsave('new_img.jpg',img)

灰度圖讀取

img_grey = io.imread('image.jpg',as_grey=True)
print(img_grey.dtype)  #float64    原因加入as_grey引數後,imread將灰度圖的矩陣值歸一化。
#可以用skimage中的color模組得到灰度圖
img_grey = color.rgb2grey(img)  #彩色轉灰度
skimage.clolor.grey2rgb(img_grey)#灰度轉彩色

影象處理

影象縮放與旋轉

from skimage import transform  
#resize
img_resize = transform.resize(img,(h,w)) #(h,w)新影象尺寸
#rescale #按比例縮放 
img_r1 = transform.rescale(img,0.1) #將影象高寬縮小為原圖片大小的0.1倍
img_r2 = transform.rescale(img,[0.5,0.2])#高縮小到0.5倍,寬縮小到0.2倍
#旋轉rotate
img_90 = transform.rotate(img,90) #旋轉90度不改變大小
img_30 = transform.rotate(img,30,resize=True)#旋轉30度,同時改變大小

影象濾波

skimage庫中通過filters模組進行濾波操作。

  • sobel運算元,sobel運算元可以用來檢測邊緣
from skimage import filters
edges = filters.sobel(img)
  • roberts運算元,用於檢測邊緣
edges = filters.roberts(img)
  • canny運算元,用於提取邊緣特徵,在feature模組內,通過修改sigma的值來調整效果,sigma越小線條越細。
from skimage import feature
edges1 = feature.canny(img) #sigma=1
edges2 = feature.canny(img,sigma=3)#sigma=3
  • gabor濾波,用於邊緣檢測和紋理特徵提取,通過調整frequency值來調整濾波效果,返回一對邊緣結果,一個是用真實濾波核的濾波結果,另一個是想象濾波核的濾波結果。
filt_real,filt_fake = fileters.gabor_filter(img,frequency=0.4)
  • gaussian濾波,多維濾波器,平滑濾波,可以消除高斯噪聲,通過調節sigma的值來調整濾波效果,sigma越大,影象越模糊。
edges = filters.gaussian_filter(img,sigma=0.4)
  • median濾波,中值濾波,平湖濾波,消除噪聲。需要用skimage.morphology模組來設定濾波器的形狀,濾波器越大,影象越模糊。
from skimage.morphology import disk
edges = filters.median(img,disk(5))

影象批處理操作

  • 從不同資料夾裡讀取不同格式的圖片:
import skimage.io as io
from skimage import data_dir
path='c:/pic/*.jpg:d:/pic/*.png'
img_coll = io.ImageCollection(path)

path是兩個路徑合在一起的字串,中間由隔開,可以再新增其他路徑。

  • 批量重新命名
import os 
os.rename(oldname,newname)#oldname,newname為檔名或者路徑,需包含檔案字尾。

歡迎指正錯誤,請評論區留言。