SciPy中兩個模塊:io 和misc的使用
1、讀寫.mat文件
如果你有一些數(shù)據(jù),或者在網(wǎng)上下載到一些有趣的數(shù)據(jù)集,這些數(shù)據(jù)以Matlab的.mat 文件格式存儲,那么可以使用scipy.io 模塊進行讀取。
data = scipy.io.loadmat('test.mat')
上面代碼中,data 對象包含一個字典,字典中的鍵對應(yīng)于保存在原始.mat 文件中的變量名。由于這些變量是數(shù)組格式的,因此可以很方便地保存到.mat 文件中。
你僅需創(chuàng)建一個字典(其中要包含你想要保存的所有變量),然后使用savemat() 函數(shù):
data = {} data['x'] = x scipy.io.savemat('test.mat',data)
因為上面的腳本保存的是數(shù)組x,所以當(dāng)讀入到Matlab 中時,變量的名字仍為x。
2、以圖像形式保存數(shù)組
因為我們需要對圖像進行操作,并且需要使用數(shù)組對象來做運算,所以將數(shù)組直接保存為圖像文件1 非常有用。本書中的很多圖像都是這樣的創(chuàng)建的。
imsave() 函數(shù)可以從scipy.misc 模塊中載入。要將數(shù)組im 保存到文件中,可以使用下面的命令:
from scipy.misc import imsave imsave('test.jpg',im)
scipy.misc 模塊同樣包含了著名的Lena 測試圖像:
lena = scipy.misc.lena()
該腳本返回一個512×512 的灰度圖像數(shù)組。
補充:圖像預(yù)處理的幾個模塊:PIL、scipy.misc、OpenCV、TensorFlow
1、PIL庫
Python Imaging Library (PIL)是PythonWare公司提供的免費的圖像處理工具包,是python下的圖像處理模塊,支持多種格式,并提供強大的圖形與圖像處理功能。
雖然在這個軟件包上要實現(xiàn)類似MATLAB中的復(fù)雜的圖像處理算法并不太適合,但是Python的快速開發(fā)能力以及面向?qū)ο蟮鹊戎T多特點使得它非常適合用來進行原型開發(fā)。
對于簡單的圖像處理或者大批量的簡單圖像處理任務(wù),python+PIL是很好的選擇。
from PIL import Image,ImageEnhance #調(diào)用庫 im = Image.open("E:/testdata/01.jpg") #打開圖片 print (im.format, im.size, im.mode) #打印圖像信息 ''' format:圖像屬性,如png,jpeg size:圖像分辨率 mode: 1 1位像素,黑和白,存成8位的像素 L 8位像素,黑白 P 8位像素,使用調(diào)色板映射到任何其他模式 RGB 3× 8位像素,真彩 RGBA 4×8位像素,真彩+透明通道 CMYK 4×8位像素,顏色隔離 YCbCr 3×8位像素,彩色視頻格式 I 32位整型像素 F 32位浮點型像素 ''' new_im = im.convert('L') # 將圖像轉(zhuǎn)為其它模式 new_im.save("E:/testdata/02.png") # 保存圖像,可以改變圖像格式 box = (0, 0, 500, 500) # 確定拷貝區(qū)域大小(左上角坐標(biāo),右下角坐標(biāo)) region = im.crop(box) # 將im表示的圖片對象拷貝到region中,大小為box region = im.resize((400, 400),Image.ANTIALIAS) # 改變圖像尺寸 ''' 函數(shù)原型:im.resize(size, filter): size:所要求的尺寸,是一個二元組:(width, height) filter:為NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一 ''' im_30 = im.rotate(30, Image.NEAREST,1)# 圖像逆時針旋轉(zhuǎn)30度 ''' 函數(shù)原型:im.rotate(angle,filter=NEAREST, expand=0) ⇒ image angle:逆時針旋轉(zhuǎn)的角度值 filter:NEAREST、BILINEAR或者BICUBIC之一 expand,如果為true,表示輸出圖像足夠大,可以裝載旋轉(zhuǎn)后的圖像。 如果為false或者缺省,則輸出圖像與輸入圖像尺寸一樣大。 ''' r,g,b=im.split() # 分割成三個通道,此時r,g,b分別為三個圖像對象。 new_im=Image.merge("RGB",(r,g,b))# 將r,g,b,三通道合并 example = np.random.randint(0,255,size=(300,300,3)) # numpy數(shù)組 new_img = Image.fromarray(example, 'RGB')# 將numpy的narray轉(zhuǎn)為Image類,第二個參數(shù)為mode new_im.show() # 顯示圖像 # ---------將索引圖變成彩色圖------------------- cmap = [np.random.randint(0, 255) for x in range(768)] # 生成色彩隱射圖,大小需要為256*3=768 img = img.convert('P') # 轉(zhuǎn)換為P模式 img.putpalette(cmap) # 給索引圖著色 img.show() # 顯示圖像 #----------圖像增強----------------------- # 增強亮度 enhanceImg = ImageEnhance.Brightness(img) # 圖片尖銳化 enhanceImg = ImageEnhance.Sharpness(img) # 對比度增強 enhanceImg = ImageEnhance.Contrast(img) # 色彩增強 enhanceImg = ImageEnhance.Color(img) enhanceImg.enhance(2.0).show() # 2.0表示增強兩倍,1.0表示不增強。
注意:Image只接收uint8類型的數(shù)據(jù),如果傳入float32類型的數(shù)據(jù)就會出錯。
2、scipy.misc
python在科學(xué)計算領(lǐng)域有三個非常受歡迎庫,numpy、SciPy、matplotlib。
numpy是一個高性能的多維數(shù)組的計算庫,SciPy是構(gòu)建在numpy的基礎(chǔ)之上的,它提供了許多的操作numpy的數(shù)組的函數(shù)。SciPy是一款方便、易于使用、專為科學(xué)和工程設(shè)計的python工具包,它包括了統(tǒng)計、優(yōu)化、整合以及線性代數(shù)模塊、傅里葉變換、信號和圖像圖例,常微分方差的求解等。
下面就簡單的介紹一下SciPy在圖像處理方面的應(yīng)用,如果專業(yè)做圖像處理當(dāng)然還是建議使用opencv。
from scipy.misc import imread,imsave,imresize import scipy.io img = imread("E:/testdata/01.jpg") # 讀取圖像 print (img)# numpy 數(shù)組 img_type = img.dtype# 獲取圖片的數(shù)據(jù)類型 print(img_type) # uint8 img_shape = img.shape # 獲取圖片的大小 print(img_shape) # (310, 493, 3) newimg=imresize(img,(100,100)) # 圖像裁剪 ''' 函數(shù)原型:imresize(arr, size, interp='bilinear', mode=None) arr:ndarray類型的圖像 size:裁剪后的尺寸,是一個元組 interp : 插值方法,為‘nearest', ‘lanczos', ‘bilinear', ‘bicubic' or ‘cubic' mode:PIL中的圖像模式 (‘P', ‘L'等等),在resize之前先轉(zhuǎn)換模式 ''' imsave("timg_color.png",newimg) # 保存圖片 # ------------使用scipy加載.mat文件------------- data = scipy.io.loadmat('Data.mat') print (data) # 一般data為一個字典類型的數(shù)據(jù)
3、OpenCV
OpenCV是一個開放源代碼的計算機視覺應(yīng)用平臺,由英特爾公司下屬研發(fā)中心俄羅斯團隊發(fā)起該項目,開源BSD證書,OpenCV的目標(biāo)是實現(xiàn)實時計算機視覺,,是一個跨平臺的計算機視覺庫。從開發(fā)之日起就得到了迅猛發(fā)展,獲得了眾多公司和業(yè)界大牛的鼎力支持與貢獻,因為是BSD開源許可,因此可以免費應(yīng)用在科研和商業(yè)應(yīng)用領(lǐng)域。
OpenCV中已經(jīng)包含如下應(yīng)用領(lǐng)域功能:二維和三維特征工具箱、運動估算、人臉識別系統(tǒng)、姿勢識別、人機交互、移動機器人、運動理解、對象鑒別、分割與識別、立體視覺、運動跟蹤、增強現(xiàn)實(AR技術(shù))?;谏鲜龉δ軐崿F(xiàn)需要,OpenCV中還包括以下基于統(tǒng)計學(xué)機器學(xué)習(xí)庫:Boosting算法、Decision Tree(決策樹)學(xué)習(xí)、Gradient Boosting算法、EM算法(期望最大化)、KNN算法、樸素貝葉斯分類、人工神經(jīng)網(wǎng)絡(luò)、隨機森林、支掌向量機。
編程語言:OpenCV中多數(shù)模塊是基于C++實現(xiàn),其中有少部分是基于C語言實現(xiàn),當(dāng)前OpenCV提供的SDK已經(jīng)支持C++、Java、Python等語言應(yīng)用開發(fā)。當(dāng)前OpenCV本身新開發(fā)的算法和模塊接口都是基于C++產(chǎn)生。OpenCV-Python使用Numpy,這是一個高度優(yōu)化的數(shù)據(jù)庫操作庫,具有MATLAB風(fēng)格的語法。所有OpenCV數(shù)組結(jié)構(gòu)都轉(zhuǎn)換為Numpy數(shù)組。這也使得與使用Numpy的其他庫(如SciPy和Matplotlib)集成更容易。接下來介紹OpenCV的核心操作:
import cv2 img = cv2.imread('E:/testdata/01.jpg') # 讀取圖像 print( img.shape ) print (img) b,g,r = cv2.split(img) # 拆分圖像通道 img = cv2.merge((b,g,r)) # 合并圖像通道 res=cv2.resize(img,(50,50),interpolation=cv2.INTER_CUBIC)# 圖像縮放 ''' INTER_NEAREST 最近鄰插值 INTER_LINEAR 雙線性插值(默認(rèn)設(shè)置) INTER_AREA 使用像素區(qū)域關(guān)系進行重采樣。 它可能是圖像抽取的首選方法,因為它會產(chǎn)生無云紋理的結(jié)果。 但是當(dāng)圖像縮放時,它類似于INTER_NEAREST方法。 INTER_CUBIC 4x4像素鄰域的雙三次插值 INTER_LANCZOS4 8x8像素鄰域的Lanczos插值 ''' img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 轉(zhuǎn)換讀取圖像的通道順序,cv2默認(rèn)為BGR順序,這里轉(zhuǎn)為RGB,其它軟件均為RGB cv2.imwrite("hehe.jpg",res)# 保存圖像 cv2.imshow("res",res)# 顯示圖像 cv2.waitKey(0) cv2.destroyAllWindows()
注意:cv2默認(rèn)為 BGR順序,而其他軟件(PIL、scopy.misc)一般使用RGB,所以當(dāng)cv2和其它混用時需要用cv2.cvtColor()轉(zhuǎn)換通道
4、tf.image模塊
(1)編解碼(編解碼中處理的數(shù)據(jù)類型均為tf.uint8):
tf.image.decode_jpeg(contents, channels=None, ratio=None, fancy_upscaling=None, try_recover_truncated=None, acceptable_fraction=None, name=None) tf.image.encode_jpeg(image, format=None, quality=None, progressive=None, optimize_size=None, chroma_downsampling=None, density_unit=None, x_density=None, y_density=None, xmp_metadata=None, name=None) tf.image.decode_png(contents, channels=None, name=None) tf.image.encode_png(image, compression=None, name=None)
(2)縮放(第一個函數(shù)和后面四個等價,這幾個函數(shù)接受任意的數(shù)據(jù)類型,但是輸出的類型為tf.float32):
tf.image.resize_images(images, new_height, new_width, method=0) tf.image.resize_area(images, size, name=None) tf.image.resize_bicubic(images, size, name=None) tf.image.resize_bilinear(images, size, name=None) tf.image.resize_nearest_neighbor(images, size, name=None)
(3)裁剪:
tf.image.resize_image_with_crop_or_pad(image, target_height, target_width) tf.image.pad_to_bounding_box(image, offset_height, offset_width, target_height, target_width) tf.image.crop_to_bounding_box(image, offset_height, offset_width, target_height, target_width) tf.image.random_crop(image, size, seed=None, name=None) tf.image.extract_glimpse(input, size, offsets, centered=None, normalized=None, uniform_noise=None, name=None)
(4)翻轉(zhuǎn):
tf.image.flip_up_down(image) tf.image.random_flip_up_down(image, seed=None) tf.image.flip_left_right(image) tf.image.random_flip_left_right(image, seed=None)
#coding=utf-8 import tensorflow as tf import numpy as np import os from PIL import Image # 從文件讀取數(shù)據(jù),得到的是二進制文件 image_data = tf.gfile.FastGFile("D:/test/2.jpg", 'rb').read() with tf.Session() as sess: # 將二進制數(shù)據(jù)解碼為一個Tensor,此時的數(shù)據(jù)類型為tf.uint8 img_data = tf.image.decode_jpeg(image_data) print (img_data.eval().shape) # 對圖像進行resize,0:雙線性差值。1:最近鄰居法。2:雙三次插值法。3:面積插值法。 resized = tf.image.resize_images(img_data, [500, 500], method=0) # TensorFlow的函數(shù)處理圖片后存儲的數(shù)據(jù)是float32格式的,需要轉(zhuǎn)換成uint8才能正確打印圖片。 resized = np.asarray(resized.eval(), dtype='uint8') # 顯示圖片 new_img = Image.fromarray(resized, 'RGB') new_img.show() # 對圖像進行編碼,并且保存圖像 encoded_image = tf.image.encode_jpeg(resized) print (type(encoded_image)) with tf.gfile.GFile("./3.jpg","wb") as f: f.write(encoded_image.eval())
(5)轉(zhuǎn)換圖像的數(shù)據(jù)類型:
tf.image.convert_image_dtype(image,dtype)
如果傳入的數(shù)據(jù)類型為uint8,該函數(shù)可以將0-255的uint8類型的像素值歸一化為0-1。如果傳入的數(shù)據(jù)類型為tf.float32,則該函數(shù)對圖像不做任何處理。如果傳入的數(shù)據(jù)類型為tf.int32,則處理后會變成極小的小數(shù)。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。