我的上創課題和HCI的期末作業都要用到圖像處理方面的東西,是時候玩玩兒openCV了。
但是Visual Studio又周期性地出問題了,而且我也不怎么想寫C++。恰好openCV官方已經開始支持python了,那就二話不說,dive into openCV for python。
在配置openCV之前,首先要確認你已正確安裝了NumPy,這個是必須要安裝的。
另外一個很有用的包是matplotlib,是一個很方便的繪圖工具包。假如你之前用過matlab繪圖的話,那么這個包用起來應該很順手了。
我之前下載過Anaconda,一個用python進行科學計算的平台,里面集成了諸如NumPy, SciPy, PIL, matplotlib等常用的圖像處理包。如果你自己配不好這些包,可以先下載Anaconda或之類的科學平台,然后在它的安裝目錄下找到python2X\Lib\site-packages,把需要的包粘貼到你自己的python路徑下就可以了。
在python下配置openCV還是比較簡單的。從openCV的官網下載安裝包。解壓完成后,在build\python\2.7\x86下找到cv2.pyd文件(64位系統在x64文件夾下),復制到%PYTHON27%\Lib\site-packages下就可以了。打開IDLE,輸入:
import cv2 print cv2.__version__
如果顯示出openCV的版本號,那么環境就搭建好了。簡直不能比VS簡單更多。
注意:openCV目前只支持python2.x版本。
裝好之后,我們先小試一把。如下腳本文件:
import cv2 import numpy as np from matplotlib import pyplot as plt if __name__ == '__main__': #show image with imshow img = cv2.imread('3dsmax.jpg',1) cv2.namedWindow('image', cv2.WINDOW_NORMAL) cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows()
導入包什么的我就不介紹了,下文如果沒有特別表明的話,默認包含了上述的三個導入語句。
至於if __name__ == '__main__': , 加上這個條件后,雙擊腳本文件就可以直接運行了,相當於一個main函數。
接着我們來逐個解釋用到的函數:
(1)cv2.imread() :這個函數用於讀入圖片,應輸入兩個參數:圖片路徑,顯示模式。返回一個nparray(NumPy中的數組,與python自帶的list有很多不同,此處暫且不提)。顯示模式有三種,分別是: 色彩模式——1, 灰度模式——0,帶透明度參數模式—— -1. 輸入模式對應的數字,或者直接使用常量:
cv2.IMREAD_COLOR , cv2.IMREAD_GRAYSCALE , cv.IMREAD_UNCHANGED。
(2)cv2.namedWindow() :這個沒什么好介紹的,就是初始化一個窗口。
(3)cv2.imshow() : 這個函數用於在窗口中顯示圖片,有兩個參數 :窗口名稱與圖片變量。此處的變量來自函數(1)的返回值,是一個nparray。
(4)cv2.waitKey(0) :這個函數是一個綁定鍵盤動作的函數,它的參數是一個數字,表示在相應的毫秒之后監聽鍵盤動作。我覺得它就是加入了一個阻塞,滿足條件之后解除阻塞,執行之后的語句。
(5)cv2.destroyAllWindows() : 這個函數就是關閉窗口,和(4)連起來就是按下任意鍵關閉顯示圖片的窗口。
所以,這段代碼就是讀入圖片,顯示圖片,按任意鍵關閉窗口。一段十分簡單的Hello world to openCV~~美麗的優勝美地公園!
接着我們再試一下matplotlib中的圖片顯示:
img = cv2.imread('yosemeti.jpg',0) plt.imshow(img,cmap='gray', interpolation='bicubic') plt.show()
(1)plt.imshow(): 這個函數用於將圖片放入顯示窗口中,但並不會彈出窗口。有三個參數:圖像的nparray,顯示類型cmap以及插值算法。前兩個參數前面介紹過了。第三個參數是用於選擇插值算法,填補圖像由於拉伸放大造成的不平滑的像素塊,保持一定的圖片質量。此處選擇的是雙三次插值算法,是一種精度很高但速度偏慢的算法。
(2)plt.show():彈出包含了圖片的窗口,像這個樣子:
此處有一個細節問題,那就是cv2.imread()讀入彩色圖像時,返回的nparray是按照B,G,R的順序排列的,而matplotlib中的plt.imshow()顯示彩色圖像時,是按照RGB的順序顯示的,因此就會造成紅藍色的錯亂,寫段代碼看下效果:
img = cv2.imread('yosemeti.jpg',1) b,g,r = cv2.split(img) img2 = cv2.merge([r,g,b]) plt.subplot(121) plt.imshow(img) plt.subplot(122) plt.imshow(img2) plt.show()
效果如下:
左邊是紅藍對調的圖片,右邊是正常的原圖。嗯,黃昏與清晨的區別。。。
最后推薦一個很好的網站 http://opencv-python-tutroals.readthedocs.org/en/latest/index.html#
我基本就是跟着他走,講的挺詳細的,還有一些小練習。順便也鍛煉了英文文獻閱讀能力了~