基于Python的Opencv入門教程(P2.項目結(jié)構(gòu)的最后搭建以及實現(xiàn)顯示圖片)

書接上回(doge)
搭建OpenCV項目結(jié)構(gòu)
在進入正式敲代碼前,我們先把我們所需的圖片下載下來。
下載到與你的python項目同一個文件夾里(圖片必須在與代碼文件的同級目錄)
在本教程中,我們將創(chuàng)建兩個Python腳本來幫助您學(xué)習(xí)OpenCV基礎(chǔ)知識:
我們的第一個腳本,opencv_教程_01。py將使用電影《羞羞的鐵拳》(ShengTeng.png)中的圖像介紹基本的圖像處理操作。
從這里開始,opencv_教程_02。py將向您展示如何使用這些圖像處理構(gòu)建塊來創(chuàng)建OpenCV應(yīng)用程序,以計算俄羅斯方塊圖像(tetris_blocks.png)中對象的數(shù)量。
完成以上步驟,我們的項目環(huán)境以及結(jié)構(gòu)就基本完成了!(終于要敲代碼了)

加載和顯示圖像信息

讓我們首先打開opencv_教程_01。在Pycharm的空白項目中先復(fù)制上以下代碼:
在第3行和第4行中,我們同時導(dǎo)入imutils和CV2。CV2包是OpenCV(就是本文用于打開圖片的包庫);imutils包是一系列的便利函數(shù)。
現(xiàn)在,通過導(dǎo)入,我們已經(jīng)擁有了所需的軟件,讓我們將圖像加載并顯示出來。
要加載我們的羞羞的鐵拳的圖片,我們稱之為CV2.imread(“jp.png”)。如第7行所示,我們將結(jié)果分配給圖像。我們的圖像實際上只是一個NumPy列表。
在本腳本的后面,我們將需要高度和寬度。所以在第8行,我稱之為image.shape以提取高度、寬度和深度。
高度先于寬度似乎令人困惑,但請這樣想:
我們用行的#x列#來描述矩陣
行數(shù)是我們的高度
列數(shù)就是我們的寬度
因此,表示為NumPy列表的圖像的尺寸實際上表示為(高度、寬度、深度)。
深度是頻道數(shù)-在我們的例子中,這是三個,因為我們使用三個顏色通道:藍色、綠色和紅色。
第10行顯示的打印命令將向終端輸出值:
為了使用OpenCV在屏幕上顯示圖像,我們使用CV2。第12行的CV2.imshow("Image",?image)。下一行等待按鍵(第13行)。這一點很重要,否則圖像的顯示和消失速度甚至比我們看到圖像的速度還要快。
注意:您需要實際單擊OpenCV打開的活動窗口,然后按鍵盤上的鍵來推進腳本。OpenCV無法監(jiān)控終端的輸入,因此,如果您在終端中按下一個鍵,OpenCV將不會注意到。同樣,您需要單擊屏幕上活動的OpenCV窗口,然后按鍵盤上的一個鍵。
訪問單個像素

首先,你可能會問:
什么是像素?
所有圖像都由像素組成,像素是圖像的原始構(gòu)建塊。圖像由網(wǎng)格中的像素組成。640 x 480圖像有1226列(寬度)和866行(高度)。具有這些尺寸的圖像中有1226*866=1061716像素。
灰度圖像中的每個像素都有一個表示灰度陰影的值。在OpenCV中,有256種灰度-從0到255。因此,灰度圖像將具有與每個像素相關(guān)聯(lián)的灰度值。
彩色圖像中的像素具有附加信息。在了解圖像處理后,您很快就會熟悉幾種顏色空間。為了簡單起見,我們只考慮RGB顏色空間。
在OpenCV中,RGB(紅、綠、藍)顏色空間中的彩色圖像具有與每個像素相關(guān)聯(lián)的三元組:(B、G、R)。
請注意,排序是BGR而不是RGB。這是因為當OpenCV在許多年前首次開發(fā)時,標準是BGR訂購。多年來,該標準現(xiàn)已成為RGB,但OpenCV仍保持這種“傳統(tǒng)”BGR排序,以確保沒有現(xiàn)有的代碼中斷。
BGR 3元組中的每個值的范圍為[0~255]。OpenCV中RGB圖像中的每個像素有多少種顏色?這很簡單:256*256*256=16777216。
現(xiàn)在我們已經(jīng)確切地知道像素是什么,讓我們看看如何檢索圖像中單個像素的值:
如上所示,我們的圖像尺寸是寬度=1226,高度=866,深度=3。我們可以通過指定坐標來訪問數(shù)組中的單個像素值,只要它們在最大寬度和高度范圍內(nèi)。
代碼image[100,50]從位于x=50和y=100的像素中產(chǎn)生一個3元組的BGR值(同樣,請記住,高度是行數(shù),寬度是列數(shù)-現(xiàn)在請花一秒鐘時間讓自己相信這是真的)。如上所述,OpenCV以BGR順序存儲圖像(例如,與Matplotlib不同)。查看為第16行的像素提取顏色通道值有多簡單。
結(jié)果像素值顯示在終端上:

備注
函數(shù):每種編程語言中,都需要函數(shù)的參與,python同樣也不例外。函數(shù)是集成的子程序,是算法實現(xiàn)的最小方法單位,是完成基本操作的手段的集合。編程中能夠靈活應(yīng)用函數(shù),提高程序設(shè)計的簡單化;實現(xiàn)代碼應(yīng)用的復(fù)用化;提升代碼閱讀的清晰化;加強代碼開發(fā)的強健化;加快代碼開發(fā)的效率化;增強團隊開發(fā)的便利化;降低程序理解的復(fù)雜化;減少代碼存儲的減少化??傊?,函數(shù)就是為實現(xiàn)功能或操作的獨立功能塊,可以返回也可以不返回值,可以返回一個值,可以返回多個值等。