【基礎篇】圖像的讀取、顯示與保存
小師弟(痛苦的央求著):啊啊啊啊啊,師兄,疼疼疼。二師兄我知道錯了,你快鬆手吧(嗚嗚嗚。。。)
二師兄(拽著小師弟的耳朵):知道錯了吧,人非聖賢孰能無過呢,知錯能改善莫大焉。
二師兄像個夫子一樣對小師弟說教著
小師弟錯哪裡了呢?是練功不夠用心?還是昨天偷吃了大師兄的糕點?
原來啊……二師兄是看小師弟有點好高騖遠,沒有腳踏實地就想仰望星空,對一些最基本的招式還不熟悉就開始實戰了。
那麼小師弟知道錯了嗎?
小師弟摸了摸還在發紅的耳朵,擦拭了眼角的淚水,雖然有點忿忿不平,但覺得二師兄說的還是有些道理的。自己現在還只是半瓶水,殺小怪還湊合,這要是碰到高手,豈不是一招就被KO了。想到這裡,小師弟背上就直冒冷汗,比較小師弟還沒有娶妻生子嘞。
說到做到,小師弟開始練習本門基礎心法、招式……
hhh,畢竟小師弟還是個新手,招式可能有別的門派的影子,比如這次的練習就參閱了denny的學習專欄,如有侵權嫌疑還請告知哈~
skimage提供了io模塊,裡面包含了很多我們可能對圖片進行輸入和輸出的操作,而我們在深度學習上主要運用讀取、顯示和保存,這裡只對這三種方式進行了說明,更多操作請看官網
如果想看在深度學習上的運用,請移步深度學習與我的那些事
圖像讀取
函數格式skimage.io.imread(fname, as_grey=False, plugin=None, flatten=None, **plugin_args)
- fname:文件名(注意文件路徑)
- as_grey:是否將圖片轉化為灰度圖(64-bit float)
- 返回:圖像數組,如RGB圖為Height x Width x 3
注意:如果設as_grey為True,即一張彩色圖片轉換為灰度圖,它的數據類型就由unit8變成了float,也就是由[0,255]到[0,1]
圖像顯示
函數格式skimage.io.imshow(arr, plugin=None, **plugin_args)
我們這裡顯示一個car的圖像。
from skimage.io import imread,imshow,imsaveimg = imread(car.jpg)imshow(img)
如圖,car的尺寸是1280x1920
當然,圖像的顯示還可以使用matplotlib.pyplot函數。
顯示函數為:matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, data=None, **kwargs)- X:圖片數組;
- cmap:顏色圖譜,默認是RGB顏色空間
其他的可選的顏色圖譜如下:
而在imshow之前,需要使用figure函數和subplot函數分別創建主窗口和子圖。
mayplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class matplotlib.figure.Figure>, clear=False, **kwargs)
- num:整型或字元型。如果為整型,則表示窗口序號;如果為字元型,則表示窗口名稱。注意如果兩個窗口序號或名稱相同,則後一個窗口會覆蓋前一個窗口;
- figsize:設置窗口大小;
- dpi:表示窗口解析度;
- facecolor:窗口背景顏色;
- edgecolor:窗口邊框顏色; 一般我們是需要創建多個窗口的,而上面介紹的函數只能創建一個窗口,所以我們需要對其進行修改:matplotlib.pyplot.subplot(nrows, ncols, plot_number)
- nrows:子圖行數;
- ncols:子圖列數;
- plot_number:當前子圖編號。
下面來實現一個圖像及其R G B 通道共四幅圖像。
img = imread(car.jpg)plt.figure(num=car,figsize=(8,8)) #創建一個名為astronaut的窗口,並設置大小 plt.subplot(2,2,1) #將窗口分為兩行兩列四個子圖,則可顯示四幅圖片plt.title(origin image) #第一幅圖片標題plt.imshow(img) #繪製第一幅圖片plt.axis(off) #不顯示坐標尺寸plt.subplot(2,2,2) #第二個子圖plt.title(R channel) #第二幅圖片標題plt.imshow(img[:,:,0],plt.cm.gray) #繪製第二幅圖片,且為灰度圖plt.axis(off) #不顯示坐標尺寸plt.subplot(2,2,3) #第三個子圖plt.title(G channel) #第三幅圖片標題plt.imshow(img[:,:,1],plt.cm.gray) #繪製第三幅圖片,且為灰度圖plt.axis(off) #不顯示坐標尺寸plt.subplot(2,2,4) #第四個子圖plt.title(B channel) #第四幅圖片標題plt.imshow(img[:,:,2],plt.cm.gray) #繪製第四幅圖片,且為灰度圖plt.axis(off) #不顯示坐標尺寸plt.show() #顯示窗口
顯示結果:
當然,要繪製多圖的,其實還有更簡便的方法,就是用subplots來創建顯示窗口與劃分子圖:matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
該例子的實現可參閱免疫組織化學染色體顏色分離。
圖像的保存
函數格式為:skimage..io.imsave(fname, arr, plugin=None, **plugin_args)
- fname:要保存的路徑
- arr:圖片的數據 可以修改圖片尺寸保存、對圖片進行加噪處理後保存等,這裡就不再程序演示。
附加題
下面介紹一些常用操作,使得我們可以輸出一些圖像的信息,比如尺寸、類型。
- type(img):輸出類型
- img.shape:輸出尺寸(height,width,channel)的三維數組
- img.size:總像素個數,height、width和channel的乘積
推薦閱讀:
※菜鳥學tensorflow.3
※Rethinking ICCV 2017 [Part 1]
※讀論文系列:Object Detection NIPS2015 Faster RCNN
※caffe 編譯bug匯總
※【論文筆記】Unlabeled Samples Generated by GAN Improve the Person Re-identification Baseline in