OpenCV+Python入門 詳細教程(第一節)


第一節 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:讀取標記,用來控制讀取圖像后返回的文件類型。
表1-1 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() 能夠讀取多種不同類型的圖片,具體如下:

表1-2 支持的圖像格式
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

 

 

 

 

 

 


免責聲明!

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



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