第一節 OpenCV 入門
[聲明:本文根據官方文檔進行通俗易懂的個人總結,隨筆和文章都是同步的!]
注:作為本博客的第一篇隨筆,小編力求為每一位閱讀者以通俗易懂的方式,完全掌握數字圖像處理的基礎,記得關注哦!
各位小可愛們,從這篇隨筆開始,讓我們踏上0基礎學習OpenCV進行圖像處理的奇妙之旅。
前言
OpenCV是一個開源的計算機視覺庫, 在Python中都有非常完備的內部公開的計算機視覺接口。 對於剛入門的新人來說,使用這些接口比重復造輪子方便多了。這些接口可以讓我們更加方便、不用理解內部原理,就能實現各種功能的圖像處理技術,OpenCV正是基於為計算機視覺提供通用接口這一目標而被策划的。
1. 入門
1.1 環境配置
安裝 python3.x 以上的版本,opencv 版本在 4.x 以上(opencv3.x 和 opencv4.x 版本內容不兼容)
這里提供 opencv 的安裝方式:
pip install opencv-python -i https://pypi.douban.com/simple
為了提高下載速度,使用國內的鏡像源,這里提供幾個國內的鏡像源,方便大家下載:
豆瓣:https://pypi.douban.com/simple
阿里雲::https://mirrors.aliyun.com/pypi/simple
清華大學:https://pypi.tuna.tsinghua.edu.cn/simple
中國科技大學:https://pypi.mirrors.ustc.edu.cn/simple
在這里,本人安裝的版本是 4.4.0.46
為了后期的需要,同樣需要安裝 numpy 模塊,這個模塊大家不知道也沒有關系,后期一步一步接觸就自然明白。
NumPy 是高性能科學計算和數據分析的基礎包;它是 pandas 等其他工具的基礎。
numpy 的安裝方式:
pip install numpy -i https://pypi.douban.com/simple
本人安裝的版本是 1.19.4
1.2 圖像處理的基礎操作
OK! 到這里呢,就是正式開始我們的 OpenCV 的學習了。
在圖像處理的開始呢,我們當然要先知道怎么樣去讀取一個圖片
1.2.1 讀取圖像
OpenCV 提供了函數 cv2.imread() 來讀取圖像,該函數呢,支持各種的靜態圖像格式。
格式:
retval = cv2.imread( filename [, flags])
在這里,把每個參數解釋一下:
- retval:返回值,這個值是讀取到的圖像,如果未讀取到,返回 “None”;
- filename:讀取圖像的完整路徑名;
- flags:讀取標記,用來控制讀取圖像后返回的文件類型。
值 | 含義 | 數值 |
cv2.IMREAD_UNCHANGED | 保持原格式不變 | -1 |
cv2.IMREAD_GRAYSCALE | 將圖像調整為單通道的灰度圖像 | 0 |
cv2.IMREAD_COLOR | 將圖像調整為3通道的BGR圖像。該值是默認值 | 1 |
cv2.IMREAD_ANYDEPTH | 當載入的圖像深度為16位或者32位時,就返回其對應的深度圖像;否則,將其轉換為8位圖像 | 2 |
cv2.IMREAD_ANYCOLOR | 以任何可能的顏色格式讀取圖像 | 4 |
函數 cv2.imread() 能夠讀取多種不同類型的圖片,具體如下:
Windows位圖 | *.bmp、*.dib |
JPEG文件 | *.jpeg、* jpg、 * jpe |
JPEG 2000文件 | *.jp2 |
便攜式網絡圖形(Portable Network Graphis, PNG)文件 | .png |
WebP文件 | * .webp |
便攜式圖像格式(Portable Image Format) | *.pbm、*.pgm、 *ppm、 *.pxm、 *.pm |
Sun (Sun rasters)格式 | *.sr、*.ras |
TIFF文件 | *.tiff、 *.tif |
OpenEXR圖像文件 | * .exr |
Radiance格式高動態范圍 (Hig-Dyamic Range, HDR)成像圖像 | *.hdr、*.pic |
GDAL支持的柵格和矢量地理空間數據 | Raster、Vector 兩大類 |
例如:我們讀取名為 img.bmp 的圖像,並保持原有格式讀入,則使用的語句為:
lena = cv2.imread("img.bmp",-1)
注:上述的代碼運行之前,首先需要導入 cv2 模塊,為了方便理解,我們在這里函數的前綴都使用 "cv2." 表示:
import cv2 lena = cv2.imread("img.bmp",-1)
1.2.2 顯示圖像
OpenCV 提供了多個與顯示有關的函數,下面對常用的幾個進行簡單介紹。
1. namedWindow 函數
函數 cv2.namedWindow() 用來創建指定名稱的窗口,其語法格式為:
None = cv2.namedWindow(winname)
式中,winname 是要創建的窗口的名稱。
例如, 下列語句會創建一個 名為 lesson 的窗口:
cv2.namedWindow("lesson")
2. imshow函數
函數 cv2. imshow() 用來顯示圖像,其語法格式為:
None = cv2.imshow(winname, mat)
式中:
- winname 是窗口名稱。
- mat是要顯示的圖像。
例:完整代碼:
import cv2 lena=cv2.imread("lena .bmp") cv2.namedWindow("lesson") cv2.imshow("lesson", lena)
注:為了方便,文章中的圖像由讀者自行在電腦上進行操作,這里不再演示,望理解!(只是改變代碼中的文件名即可)
3. waitKey 函數
函數 cv2.waitKey() 用來等待按鍵,當用戶按下鍵盤后,該語句會被執行,並獲取返回值.其語法格式為:
retval = cv2.waitKey( [delay] )
- retval:表示返回值。如果沒有按鍵被按下,則返回-1;如果有按鍵被按下,則返回該按鍵的ASCII碼。
- delay:表示等待鍵盤觸發的時間,單位是ms,當該值是負數或者零時,表示無限等待。該值默認為0。
在實際使用中,可以通過函數 cv2.waitKey() 獲取按下的按鍵,並針對不同的鍵做出不同的反應,從而實現交互功能。
例如, 如果按下A鍵,則打開名為“PressA”的窗口,如果按下B鍵,則打開名為“PressB”的窗口。
import cv2 lena=cv2.imread("lena.bmp") cv2.imshow("demo", lena) key=cv2.waitKey() if key == ord('A') : cv2.imshow ("PressA", lena) elif key == ord('B'): cv2.imshow ("PressB", lena)
Python提供了函數 ord(),用來獲取字符的ASCII碼值。
因此,在判斷是否按下了某個特定的按鍵時,可以先使用 ord() 函數獲取該特定字符的 ASCII 碼值,再將該值與 cv2.waitKey() 函數的返回值進行比較,從而確定是否按下了某個特定的鍵。這樣,在程序設計中就不需要 ASCII 值的直接參與了,從而避免了使用 ASCII 進行比較可能帶來的不便。
4. destroyWindow 函數
函數 cv2.destroyWindow() 用來釋放(銷毀)指定窗口,其語法格式為:
None = cv2.destroyWindow(winname)
其中,winname 是窗口的名稱。
在實際使用中,該函數通常與函數 cv2.waitKey() 組合實現窗口的釋放。
import cv2 lena = cv2.imread("lena.bmp") cv2.imshow("demo", lena) cv2.waitKey() cv2.destroywWindow ("demo")
運行上述程序,首先會在一個 名為 demo 的窗口內顯示 lena.bmp 圖像。
在程序運行的過程中,當未按下鍵盤上的按鍵時,程序沒有新的狀態出現:當按下鍵盤上的任意一個按鍵后,窗口 demo 會被釋放。
5. destroyAIlWindows函數
函數 cv2.destroyAlIWindows() 用來釋放(銷毀)所有窗口,其語法格式為:
None = cv2.destroyAllWindows( )
例:編寫一個程序,演示如何使用函數 cv2.destroyAllWindows() 釋放所有窗口。根據題目要求,編寫代碼如下:
import cv2 lena = cv2.imread("lena.bmp") cv2.imshow("demo1", lena) cv2.imshow("demo2", lena) cv2.waitKey() cv2.destroyAllWindows()
運行上述程序,會分別出現名稱為 demol 和 demo2 的窗口,在兩個窗口中顯示的都是 lena.bmp 圖像。
在未按下鍵盤上的按鍵時,程序沒有新的狀態出現,當按下鍵盤上的任意一個按鍵后,兩個窗口都會被釋放。
1.2.3 保存圖像
OpenCV提供了函數 cv2.imwrite() ,用來保存圖像,該函數的語法格式為:
retval = cv2.imwrite(filename, img [, params])
- retval:返回值。如果保存成功,則返回邏輯值真(True);如果保存不成功,則返回邏輯值假(False)。
- filename:要保存的目標文件的完整路徑名,包含文件擴展名。
- img:被保存圖像的名稱。
- params:保存類型參數,是可選的。
例:編寫一個程序,將讀取的圖像保存到當前目錄下。
import cv2 lena = cv2.imread ("lena.bmp") r = cv2.imwrite("result.bmp", lena)
注:在這里不要將 filename 和 img 名稱弄反了,小編在這里也會經常出錯誤哦!
好啦好啦!本次隨筆已經更新結束嘍!
一大早起來同步了一下隨筆,連早飯都沒吃,要去吃飯嘍,拜拜,各位小可愛們!
作者:堅果不愛吃松鼠
本文版權歸作者和博客園共有,轉載須表明出處,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。
如果覺得還有幫助的話,可以點一下右下角的【推薦】。
本文鏈接:https://www.cnblogs.com/GLblogs/p/14642994.html