【基礎篇】圖像的讀取、顯示與保存

小師弟(痛苦的央求著):啊啊啊啊啊,師兄,疼疼疼。二師兄我知道錯了,你快鬆手吧(嗚嗚嗚。。。)

二師兄(拽著小師弟的耳朵):知道錯了吧,人非聖賢孰能無過呢,知錯能改善莫大焉。

二師兄像個夫子一樣對小師弟說教著

小師弟錯哪裡了呢?是練功不夠用心?還是昨天偷吃了大師兄的糕點?

原來啊……二師兄是看小師弟有點好高騖遠,沒有腳踏實地就想仰望星空,對一些最基本的招式還不熟悉就開始實戰了。

那麼小師弟知道錯了嗎?

小師弟摸了摸還在發紅的耳朵,擦拭了眼角的淚水,雖然有點忿忿不平,但覺得二師兄說的還是有些道理的。自己現在還只是半瓶水,殺小怪還湊合,這要是碰到高手,豈不是一招就被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

TAG:計算機視覺 | 圖像處理 | Python庫 |