App下載

SciPy中兩個(gè)模塊:io 和misc的使用介紹

猿友 2021-07-30 11:27:43 瀏覽數(shù) (2705)
反饋

SciPy庫(kù)是一個(gè)著名的python的開(kāi)源科學(xué)庫(kù),通過(guò)操作NumPy數(shù)據(jù)來(lái)進(jìn)行科學(xué)計(jì)算和統(tǒng)計(jì)分析。這個(gè)庫(kù)有很多的功能,今天小編就介紹一下SciPy數(shù)據(jù)讀寫(xiě)和SciPy圖像處理這兩個(gè)功能。

1、讀寫(xiě).mat文件

如果你有一些數(shù)據(jù),或者在網(wǎng)上下載到一些有趣的數(shù)據(jù)集,這些數(shù)據(jù)以Matlab的.mat 文件格式存儲(chǔ),那么可以使用scipy.io 模塊進(jìn)行讀取。

data = scipy.io.loadmat('test.mat') 

上面代碼中,data 對(duì)象包含一個(gè)字典,字典中的鍵對(duì)應(yīng)于保存在原始.mat 文件中的變量名。由于這些變量是數(shù)組格式的,因此可以很方便地保存到.mat 文件中。

你僅需創(chuàng)建一個(gè)字典(其中要包含你想要保存的所有變量),然后使用savemat() 函數(shù):

data = {}  
data['x'] = x  
scipy.io.savemat('test.mat',data) 

因?yàn)樯厦娴哪_本保存的是數(shù)組x,所以當(dāng)讀入到Matlab 中時(shí),變量的名字仍為x。

2、以圖像形式保存數(shù)組

因?yàn)槲覀冃枰獙?duì)圖像進(jìn)行操作,并且需要使用數(shù)組對(duì)象來(lái)做運(yùn)算,所以將數(shù)組直接保存為圖像文件1 非常有用。本書(shū)中的很多圖像都是這樣的創(chuàng)建的。

imsave() 函數(shù)可以從scipy.misc 模塊中載入。要將數(shù)組im 保存到文件中,可以使用下面的命令:

from scipy.misc import imsave  
imsave('test.jpg',im) 

scipy.misc 模塊同樣包含了著名的Lena 測(cè)試圖像:

lena = scipy.misc.lena() 

該腳本返回一個(gè)512×512 的灰度圖像數(shù)組。

補(bǔ)充:圖像預(yù)處理的幾個(gè)模塊:PIL、scipy.misc、OpenCV、TensorFlow

1、PIL庫(kù)

Python Imaging Library (PIL)是PythonWare公司提供的免費(fèi)的圖像處理工具包,是python下的圖像處理模塊,支持多種格式,并提供強(qiáng)大的圖形與圖像處理功能。

雖然在這個(gè)軟件包上要實(shí)現(xiàn)類似MATLAB中的復(fù)雜的圖像處理算法并不太適合,但是Python的快速開(kāi)發(fā)能力以及面向?qū)ο蟮鹊戎T多特點(diǎn)使得它非常適合用來(lái)進(jìn)行原型開(kāi)發(fā)。

對(duì)于簡(jiǎn)單的圖像處理或者大批量的簡(jiǎn)單圖像處理任務(wù),python+PIL是很好的選擇。

from PIL import Image,ImageEnhance     #調(diào)用庫(kù)
 
im = Image.open("E:/testdata/01.jpg")  #打開(kāi)圖片
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位浮點(diǎn)型像素
'''
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表示的圖片對(duì)象拷貝到region中,大小為box
 
region = im.resize((400, 400),Image.ANTIALIAS) # 改變圖像尺寸
'''
  函數(shù)原型:im.resize(size, filter):
    size:所要求的尺寸,是一個(gè)二元組:(width, height)
    filter:為NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一
'''
 
im_30 = im.rotate(30, Image.NEAREST,1)         # 圖像逆時(shí)針旋轉(zhuǎn)30度
'''
  函數(shù)原型:im.rotate(angle,filter=NEAREST, expand=0) ? image
    angle:逆時(shí)針旋轉(zhuǎn)的角度值
    filter:NEAREST、BILINEAR或者BICUBIC之一
    expand,如果為true,表示輸出圖像足夠大,可以裝載旋轉(zhuǎn)后的圖像。
            如果為false或者缺省,則輸出圖像與輸入圖像尺寸一樣大。
'''
r,g,b=im.split()                             # 分割成三個(gè)通道,此時(shí)r,g,b分別為三個(gè)圖像對(duì)象。
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類,第二個(gè)參數(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()                                   # 顯示圖像
 
#----------圖像增強(qiáng)-----------------------
# 增強(qiáng)亮度
enhanceImg = ImageEnhance.Brightness(img)
# 圖片尖銳化
enhanceImg = ImageEnhance.Sharpness(img) 
# 對(duì)比度增強(qiáng)
enhanceImg = ImageEnhance.Contrast(img)  
# 色彩增強(qiáng)
enhanceImg = ImageEnhance.Color(img) 
enhanceImg.enhance(2.0).show()    # 2.0表示增強(qiáng)兩倍,1.0表示不增強(qiáng)。
 

注意:Image只接收uint8類型的數(shù)據(jù),如果傳入float32類型的數(shù)據(jù)就會(huì)出錯(cuò)。

2、scipy.misc

python在科學(xué)計(jì)算領(lǐng)域有三個(gè)非常受歡迎庫(kù),numpy、SciPy、matplotlib。

numpy是一個(gè)高性能的多維數(shù)組的計(jì)算庫(kù),SciPy是構(gòu)建在numpy的基礎(chǔ)之上的,它提供了許多的操作numpy的數(shù)組的函數(shù)。SciPy是一款方便、易于使用、專為科學(xué)和工程設(shè)計(jì)的python工具包,它包括了統(tǒng)計(jì)、優(yōu)化、整合以及線性代數(shù)模塊、傅里葉變換、信號(hào)和圖像圖例,常微分方差的求解等。

下面就簡(jiǎn)單的介紹一下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:裁剪后的尺寸,是一個(gè)元組
    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為一個(gè)字典類型的數(shù)據(jù)

3、OpenCV

OpenCV是一個(gè)開(kāi)放源代碼的計(jì)算機(jī)視覺(jué)應(yīng)用平臺(tái),由英特爾公司下屬研發(fā)中心俄羅斯團(tuán)隊(duì)發(fā)起該項(xiàng)目,開(kāi)源BSD證書(shū),OpenCV的目標(biāo)是實(shí)現(xiàn)實(shí)時(shí)計(jì)算機(jī)視覺(jué),,是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺(jué)庫(kù)。從開(kāi)發(fā)之日起就得到了迅猛發(fā)展,獲得了眾多公司和業(yè)界大牛的鼎力支持與貢獻(xiàn),因?yàn)槭荁SD開(kāi)源許可,因此可以免費(fèi)應(yīng)用在科研和商業(yè)應(yīng)用領(lǐng)域。

OpenCV中已經(jīng)包含如下應(yīng)用領(lǐng)域功能:二維和三維特征工具箱、運(yùn)動(dòng)估算、人臉識(shí)別系統(tǒng)、姿勢(shì)識(shí)別、人機(jī)交互、移動(dòng)機(jī)器人、運(yùn)動(dòng)理解、對(duì)象鑒別、分割與識(shí)別、立體視覺(jué)、運(yùn)動(dòng)跟蹤、增強(qiáng)現(xiàn)實(shí)(AR技術(shù))。基于上述功能實(shí)現(xiàn)需要,OpenCV中還包括以下基于統(tǒng)計(jì)學(xué)機(jī)器學(xué)習(xí)庫(kù):Boosting算法、Decision Tree(決策樹(shù))學(xué)習(xí)、Gradient Boosting算法、EM算法(期望最大化)、KNN算法、樸素貝葉斯分類、人工神經(jīng)網(wǎng)絡(luò)、隨機(jī)森林、支掌向量機(jī)。

編程語(yǔ)言:OpenCV中多數(shù)模塊是基于C++實(shí)現(xiàn),其中有少部分是基于C語(yǔ)言實(shí)現(xiàn),當(dāng)前OpenCV提供的SDK已經(jīng)支持C++、Java、Python等語(yǔ)言應(yīng)用開(kāi)發(fā)。當(dāng)前OpenCV本身新開(kāi)發(fā)的算法和模塊接口都是基于C++產(chǎn)生。OpenCV-Python使用Numpy,這是一個(gè)高度優(yōu)化的數(shù)據(jù)庫(kù)操作庫(kù),具有MATLAB風(fēng)格的語(yǔ)法。所有OpenCV數(shù)組結(jié)構(gòu)都轉(zhuǎn)換為Numpy數(shù)組。這也使得與使用Numpy的其他庫(kù)(如SciPy和Matplotlib)集成更容易。接下來(lái)介紹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)系進(jìn)行重采樣。 它可能是圖像抽取的首選方法,因?yàn)樗鼤?huì)產(chǎn)生無(wú)云紋理的結(jié)果。 但是當(dāng)圖像縮放時(shí),它類似于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和其它混用時(shí)需要用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)縮放(第一個(gè)函數(shù)和后面四個(gè)等價(jià),這幾個(gè)函數(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ù),得到的是二進(jìn)制文件
    image_data = tf.gfile.FastGFile("D:/test/2.jpg", 'rb').read()
    with tf.Session() as sess:
      # 將二進(jìn)制數(shù)據(jù)解碼為一個(gè)Tensor,此時(shí)的數(shù)據(jù)類型為tf.uint8
      img_data = tf.image.decode_jpeg(image_data)
      print (img_data.eval().shape)  
 
      # 對(duì)圖像進(jìn)行resize,0:雙線性差值。1:最近鄰居法。2:雙三次插值法。3:面積插值法。
      resized = tf.image.resize_images(img_data, [500, 500], method=0)
 
      # TensorFlow的函數(shù)處理圖片后存儲(chǔ)的數(shù)據(jù)是float32格式的,需要轉(zhuǎn)換成uint8才能正確打印圖片。      
      resized = np.asarray(resized.eval(), dtype='uint8') 
 
      # 顯示圖片
      new_img = Image.fromarray(resized, 'RGB')    
      new_img.show()  
 
      # 對(duì)圖像進(jìn)行編碼,并且保存圖像
      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ù)對(duì)圖像不做任何處理。如果傳入的數(shù)據(jù)類型為tf.int32,則處理后會(huì)變成極小的小數(shù)。

SciPy數(shù)據(jù)讀寫(xiě)和SciPy圖像處理

到此這篇SciPy數(shù)據(jù)讀寫(xiě)和SciPy圖像處理的介紹就到這了,更多Python打包exe的教程請(qǐng)關(guān)注W3Cschool


0 人點(diǎn)贊