(转)深度学习中各种图像库的图片读取方式
https://blog.csdn.net/u013841196/article/details/81194310
- 深度學習中各種圖像庫的圖片讀取方式總結
在數據預處理過程中,經常需要寫python代碼搭建深度學習模型,不同的深度學習框架會有不同的讀取數據方式(eg:Caffe的python接口默認BGR格式,Tensorflow默認RGB格式),經常需要借助python圖像庫來讀取圖像并進行一系列的圖像處理工作。
這篇文章總結了Python圖像庫處理數據的基本方式:
1.Opencv
2.PIL(pillow)
3.matplotlib.image
4.scipy.misc
5.skimage
6.Tensorflow
opencv: cv2.imread
opencv是最常用的圖像處理庫
基本圖像操作:
import cv2 import numpy as np #讀入圖片:默認彩色圖,cv2.IMREAD_GRAYSCALE灰度圖,cv2.IMREAD_UNCHANGED包含alpha通道 img = cv2.imread('aa.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 轉換為灰度圖 img1 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) # 轉換為RGB cv2.imshow('src',img) cv2.imshow('gray',gray) cv2.imshow('RGB',img1) print(img.shape) # (h,w,c) print(img.size) # 像素總數目 print(img.dtype) # 像素類型 cv2.imwrite('test.jpg',img1) # 保存圖像值得注意的是:
1.opencv讀進來的圖片已經是一個numpy矩陣了,彩色圖片維度是(高度,寬度,通道數)。數據類型是uint8。
2.opencv讀進來的圖片的通道排列是BGR,而不是主流的RGB
Caffe使用opencv處理圖像的基本操作:
import os import numpy as np import cv2 import syscaffe_root = './fancp/caffe/' #指定caffe路徑 sys.path.insert(0, caffe_root + 'python') import caffedef predict(path, deploy, weight):net = caffe.Net( deploy, weight, caffe.TEST) batch_size, channels, height, width = net.blobs['data'].data.shapeX = np.zeros([1,channels,height,width], dtype = np.float32) # caffe的輸入格式[N,C,H,W]img = cv2.imread(path).astype(np.float32)# 讀取圖片,并進行類型轉換Img = cv2.resize(img,(102,102))[11:90,11:90,::-1]# Resize以及ROI操作img -= 127.5img /= 128.0 # 歸一化操作img = np.transpose(img,(2,0,1)) # 通道轉換,有H,W,C轉變成 C,H,W#在深度學習搭建CNN時,往往要做相應的圖像數據處理,比如圖像要擴展維度,比如 擴展成(batch_size,channels,height,width)。img=np.expand_dims(img,axis=0)X[0,:,:,:] = imgnet.blobs['data'].data[...] = Xoutput = net.forward()output = output['logits'][0]print(output) # 輸出結果return 0if __name__ == '__main__':#caffe.set_device(0)#caffe.set_mode_gpu()caffe.set_mode_cpu()model_def = '**.prototxt'model_weights = '**.caffemodel'image = 'test.jpg'result = predict(image, model_def, model_weights)PIL:PIL.Image.open
PIL即Python Imaging Library,也即為我們所稱的Pillow,是一個很流行的圖像庫,它比opencv更為輕巧,正因如此,它深受大眾的喜愛。
圖像的基本操作:
from PIL import Image import numpy as np img = Image.open('aa.jpg') print(img.format) print(img.size) #注意,省略了通道。 (w,h) print(img.mode) #L為灰度圖,RGB為真彩色,RGBA為加了透明通道 img.show() # 顯示圖片 gray = img.convert('L') # 轉化為灰度圖 gray.show() #pillow讀進來的圖片不是矩陣,我們將圖片轉矩陣 arr = np.array(img) print(arr.shape) print(arr.dtype) #矩陣再轉為圖像 new_im = Image.fromarray(arr) new_im.save('test.png')注:
1.PIL讀進來的圖像是一個對象,而不是我們所熟知的numpy 矩陣。
2.PIL的通道順序是RGB
圖像操作:
#分離合并通道 r, g, b = img.split() img = Image.merge("RGB", (b, g, r)) img = img.copy() #復制圖像 #ROI獲取 img3 = Image.open('1.jpg') roi = img3.crop((0,0,300,300)) #(左上x,左上y,右下x,右下y)坐標 roi.show()matplotlib:matplotlib.image.imread
matplotlib多用于科學繪圖
圖像的基本操作:
import matplotlib.pyplot as plt import numpy as np image = plt.imread('aa.jpg') plt.imshow(image) plt.axis('off') #也可以關閉顯示x,y軸上的數字 plt.show() #plt.imread讀入的就是一個矩陣,跟opencv一樣,但彩圖讀進的是RGB,與opencv有區別 print(image.shape) # (h,w,c) print(image.size) print(image.dtype)綜合例子:
import matplotlib.pyplot as plt import numpy as np im_lol1 = plt.imread('aa.jpg') im_lol2 = plt.imread('aa.jpg') figure = plt.figure(figsize=(10,5)) # 調整顯示圖片的大小 ''' figsize參數:指定繪圖對象的寬度和高度,單位為英寸;dpi參數指定繪圖對象的分辨率, 即每英寸多少個像素,缺省值為80。因此本例中所創建的圖表窗口的寬度為8*80 = 640像素 ''' plt.axis("off")#不顯示刻度 ax = figure.add_subplot(121) # 圖片以1行2列的形式顯示 plt.axis('off') ax.imshow(im_lol1) #第一張圖 ax.set_title('image 1')#給圖片加titile ax = figure.add_subplot(122) plt.axis('off') ax.imshow(im_lol2) ax.set_title('image 2')#給圖片加titile plt.savefig('twp.jpg') plt.show()scipy.misc:scipy.misc.imread
圖像的基本操作:
from scipy import misc import matplotlib.pyplot as plt im = misc.imread('aa.jpg') print(im.dtype) print(im.size) print(im.shape) misc.imsave('misc1.png',im) plt.imshow(im) plt.show()注:imread和imsave在后來的版本將會被棄用,現在使用imageio.imread和imageio.imwrite。
深度學習中使用misc:
from scipy import misc import numpy as np import matplotlib.pyplot as pltimage = misc.imread('./fancp/aa.jpg') image = misc.imresize(image, (112,96)) image = image.astype(np.float32) image -= 127.5 image /= 128.0 image = image[10:89,10:89,:] image = image.transpose(2, 0, 1) print(image.shape)skimage:skimage.io.imread
圖像的基本操作:
from skimage import io from skimage import color im = io.imread('aa.jpg') print(im.shape) # numpy矩陣,(h,w,c) print(im.dtype) print(im.size) im3 = color.rgb2grey(im)# 灰度化處理 io.imshow(im3) io.imsave('sk.png',im)注:圖像也是以numpy array形式讀入
Tensorflow:tf.image.decode
1.TensorFlow函數:tf.image.decode_bmp
tf.image.decode_bmp函數:
tf.image.decode_bmp(contents,channels=0,name=None )將BMP編碼圖像的第一幀解碼為uint8張量。
attr channels表示解碼圖像的期望數量的顏色通道。
接受的值是:
0:使用BMP編碼圖像中的通道數量。
3:輸出RGB圖像。
4:輸出RGBA圖像。
參數:
contents:string類型的Tensor,0維,BMP編碼的圖像。
channels:可選的int,默認為0。
name:操作的名稱(可選)。
返回值:
函數返回uint8類型的Tensor。
2.TensorFlow函數:tf.image.decode_jpeg
tf.image.decode_jpeg函數:
將JPEG編碼圖像解碼為uint8張量。
attr channels表示解碼圖像的期望數量的顏色通道。
接受的值是:
0:使用JPEG編碼圖像中的通道數量。
1:輸出灰度圖像。
3:輸出RGB圖像。
如果需要,JPEG編碼的圖像將被轉換以匹配請求的顏色通道數量。
attr ratio允許在解碼過程中將圖像縮小整數倍。允許的值為:1、2、4和8。這比稍后縮小圖像要快得多。
參數:
contents:string類型的Tensor,0維,JPEG編碼的圖像。
channels:可選的int,默認為0,解碼圖像的顏色通道數量。
ratio:可選的int,默認為1,縮小比例。
fancy_upscaling:可選的bool,默認為True,如果為true,則使用更慢但更好的色度平面升級(僅限yuv420 / 422)。
try_recover_truncated:可選的bool,默認為False,如果為true,則嘗試從截斷的輸入中恢復圖像。
acceptable_fraction:可選的float,默認為1,在截斷輸入之前所需的最小行數被接受。
dct_method:可選的string,默認為”“,用于指定用于解壓縮的算法提示的字符串;默認為“”,映射到系統特定的默認值。當前有效值為[“INTEGER_FAST”,“INTEGER_ACCURATE”]。
name:操作的名稱(可選)。
返回值:
該tf.image.decode_jpeg函數將返回uint8類型的Tensor。
3.TensorFlow函數:tf.image.decode_png
tf.image.decode_png函數:
將PNG編碼的圖像解碼為uint8或uint16張量。
attr channels表示解碼圖像的期望數量的顏色通道。
接受的值是:
0:使用PNG編碼圖像中的通道數量。
1:輸出灰度圖像。
3:輸出RGB圖像。
4:輸出RGBA圖像。
如果需要,將PNG編碼的圖像轉換為與請求的顏色通道數匹配。
此操作還支持解碼JPEG和非動畫GIF,因為界面相同,但使用tf.image.decode_image將更清晰。
參數:
contents:string類型的Tensor,0維,PNG編碼的圖像。
channels:可選的int,默認為0,解碼圖像的顏色通道數量。
dtype:可選的tf.DType,其來自:tf.uint8,tf.uint16,默認為tf.uint8。
name:操作的名稱(可選)。
返回值:
該函數返回dtype類型的Tensor。
4.TensorFlow函數:tf.image.decode_image
tf.image.decode_image函數
decode_bmp,decode_gif,decode_jpeg和decode_png的方便函數。
檢測圖像是否為BMP,GIF,JPEG或PNG,并執行相應的操作將輸入字節string轉換為類型uint8的Tensor。
注意: decode_gif返回一個4維數組[num_frames、高度、寬度、3],而不是decode_bmp、decode_jpeg和decode_png,后者返回3維數組[height, width, num_channels]。如果您使用BMP、JPEG或PNG文件混合GIF文件,請確保在構造圖表時考慮到這一點。
參數:
contents:0-D string,編碼的圖像字節。
channels:可選的int,默認為0,解碼圖像的顏色通道數量。
name:操作的名稱(可選)
返回值:
對于BMP、JPEG和PNG圖像,形狀為[height, width, num_channels]或者對于GIF圖像,形狀為[num_frames, height, width, 3]的類型為uint8的Tensor。
可能引發的異常:
ValueError:通道數量不正確。
5.TensorFlow將raw格式轉換為張量
tf.decode_raw函數
將字符串的字節重新解釋為數字的向量。
ARGS:
bytes:字符串類型的張量。所有元素的長度必須相同。
out_type:一個選自:tf.half,tf.float32,tf.float64,tf.int32,tf.uint8,tf.int16,tf.int8 以及 tf.int64 的 tf.DType 。
little_endian:可選的 bool 值,默認為 True。輸入字節是否為小字節順序。忽略存儲在單個字節 (如 uint8) 中的 out_type 值。
name:操作的名稱(可選)。
返回:
out_type 類型的張量。一個比輸入字節多一個維度的張量。添加的維度的大小將等于字節的元素的長度除以要表示 out_type 的字節數。
總結:
除了opencv讀入的彩色圖片以BGR順序存儲外,其他所有圖像庫讀入彩色圖片都以RGB存儲。
除了PIL讀入的圖片是img類之外,其他庫讀進來的圖片都是以numpy 矩陣。
參考:
https://www.cnblogs.com/skyfsm/p/8276501.html
https://www.w3cschool.cn/tensorflow_python/
注:博眾家之所長,集群英之薈萃。
總結
以上是生活随笔為你收集整理的(转)深度学习中各种图像库的图片读取方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天真无邪的婴儿摄影
- 下一篇: VIP邮箱移动办公平台软件,疫情居家办公