openCV for python 學習(一):環境搭建與圖片顯示


我的上創課題和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#

我基本就是跟着他走,講的挺詳細的,還有一些小練習。順便也鍛煉了英文文獻閱讀能力了~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM