OpenCV(python)——一鍵入門--第1篇
一:圖像讀取與展示
import cv2 as cv src = cv.imread("d:/ma.jpg") #imread函數,讀入一張圖片,放在src底下 cv.namedWindow("input",cv.WINDOW_AUTOSIZE) #namedWindow 聲明一個窗口,可以在這里調整窗口大小 cv.imshow("intput",src) #imshow函數,展示src底下的照片 cv.waitKey(0) cv.destroyAllWindows()
cv.imread()
cv,imread() 是一個圖像讀取函數,里面主要輸入一個字符串,內容是圖像所在的絕對路徑或者相對路徑。我們需要把完整的路徑用雙引號保存下來。(請注意,需要提前在路徑放好該照片)
補充:cv.imread() 除了直接讀取照片,還可以傳入第二個參數,比如可以直接設置cv.imread("圖像路徑",cv.IMREAD_GRAYSCALE),將圖像直接讀取成灰度圖。相關參考資料如下圖:
cv.namedWindow()
cv.nameWindow()是一個窗口聲明函數。第一個參數是該窗口的標題,第二個參數是窗口的模式。最常用的參數是WINDOW_AUTOSIZE。
其他參數簡介如下,感興趣的話可以參考,或者可以直接看下一個函數的介紹:
WINDOW_NORMAL 或 WINDOW_AUTOSIZE:?WINDOW_NORMAL 可以調整窗口大小,而 WINDOW_AUTOSIZE 會自動調整窗口大小以適合顯示的圖像,并且無法手動更改窗口大小。
WINDOW_FREERATIO 或 WINDOW_KEEPRATIO:?WINDOW_FREERATIO 調整圖像而不考慮其比例,而 WINDOW_KEEPRATIO 保持圖像比例。
WINDOW_GUI_NORMAL 或 WINDOW_GUI_EXPANDED:?WINDOW_GUI_NORMAL 是在沒有狀態欄和工具欄的情況下繪制窗口的舊方法,而 WINDOW_GUI_EXPANDED 是一種新的增強型 GUI。默認情況下,標志 == WINDOW_AUTOSIZE |?WINDOW_KEEPRATIO |?WINDOW_GUI_EXPANDED
cv.imshow()
cv.imshow() 是圖像展示函數,我們看代碼第5行第一個參數,是圖片展示對應的窗口名稱。如果該參數和namedWindow設置的窗口大小一致,則會將圖片放在該窗口下。如果是一個全新的標題名,OpenCV會參考該參數創建一個對應的新窗口,并展示該圖像。
補充:如果窗口是使用WINDOW_AUTOSIZE標志創建的,則圖像以其原始大小顯示,但仍受屏幕分辨率的限制。否則,它會將縮放圖像以適合窗口。該函數可以縮放圖像,具體取決于其深度:
如果圖像是 8 位無符號,則按原樣顯示。
如果圖像是 16 位無符號或 32 位整數,則將像素除以 256。即值范圍 [0,255*256] 映射到 [0,255]。
如果圖像是 32 位或 64 位浮點,則像素值乘以 255。即值范圍 [0,1] 映射到 [0,255]。
關于展示圖像相關的補充:
如果窗口是使用 OpenGL 支持創建的,則cv::imshow還支持ogl::Buffer、ogl::Texture2D和cuda::GpuMat作為輸入。
如果在此函數之前沒有創建窗口,則假定使用cv::WINDOW_AUTOSIZE創建一個窗口。
如果需要顯示大于屏幕分辨率的圖像,則需要在 imshow 之前調用 namedWindow("", WINDOW_NORMAL)。
cv.waitKey()
cv.waitKey()是一個鍵盤綁定函數,時間量度是毫秒ms。函數會等待(n)里面的n毫秒,看是否有鍵盤輸入。當有鍵盤輸入時,則會返回按鍵的ASCII值。沒有鍵盤輸入,則返回-1。一般我們設置為0,他會無限等待鍵盤的輸入。
cv.destroyAllWindows()
cv.destroyAllWindows()是用來刪除窗口的,()里不指定任何參數,則刪除所有窗口。刪除特定的窗口,則需要調用destroyWindow(),往()輸入特定的窗口值。主要用于釋放變量占用的內存
你可以調用destroyWindow()或? destroyAllWindows()來關閉窗口并取消分配任何相關的內存使用。對于一個簡單的程序來說,實際上不必調用這些函數,因為退出時操作系統會自動關閉應用程序的所有資源和窗口。如果任何相關內存使用沒有被取消分配,則調用destroyAllWindows()會處理掉分配。如果是簡單的使用或確保資源的適當使用,就不需要調用該函數。
二:圖像色域轉換
a = cv.cvtColor(src , cv.COLOR_BGR2HSV) #轉換色域,xxx2xxx #包括以下色域:YCrCb,HSV,HLS,Lab,Luv,Bayer,XYZ,GRAY cv.imshow("output",a)
提醒:當然,import 語句以及cv.waitKey(),cv.destroyAllWindows()都是很重要的語句,在往后部分僅強調核心的部分代碼,運行時候記得在首尾加上。
cv.cvtColor()
該函數將輸入圖像從一種顏色空間轉換為另一種顏色空間。 ?我們主要使用的色域空間如下:YCrCb , HSV , HLS , Lab , Luv , Bayer , XYZ , GRAY
R、G 和 B 通道值的常規范圍是:
CV_8U 圖像為 0 到 255
CV_16U 圖像的 0 到 65535
CV_32F 圖像為 0 到 1
如下圖所示,output是原圖,g-output則是圖像處于hsv色域時的圖
重點:opencv中的圖像通道默認不是RGB,而是BGR,也就是
通道0對應藍色,通道1對應綠色,通道2對應紅色
三:圖像的修改
import cv2 as cv import numpy as np m1 = src cv.imshow("m1",m1) #原圖 m2 = np.copy(src) #圖像拷貝 m2[100:300,300:500,2]=255 #修改像素坐標底下的通道值 cv.imshow("m2",m2) m3 = np.zeros(src.shape, src.dtype) #使用numpy創建一個空圖像 cv.imshow("m3", m3) m4 = np.zeros([512,215,3], np.uint16)#高 寬 通道數ch,這里是設置圖像大小 m4[:,:,1] =127 #給綠色通道賦值 127 cv.imshow("m4", m4) cv.waitKey(0) cv.destroyAllWindows()
numpy
NumPy是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。我們用簡寫np來描述numpy函數。
np.copy
拷貝矩陣。我們的圖像可以看成是一個二維矩陣,可以直接用numpy的copy函數拷貝圖像,括號內是要拷貝的圖像,然后用 “=” 號賦值給新的變量。
np.zeros
numpy.zeros(shape, dtype = float, order = 'C')
創建指定大小的數組,數組元素以 0 來填充
參數介紹:shape:數組形狀。需要傳入圖像的寬和高。也可以用 image.shape傳入數據。
dtype:數據類型。可以參考如下表格:
order:‘C’用于C的行數組。或者用‘F’用于FORTRAN的列數組
在代碼中,m2[100:300,300:500,2]=255,是將像素點從左上角開始數,坐標區間【100->300】,【300->500】的像素進行賦值。坐標和值都可以自己設置
四:像素之間的加減法
src = cv.imread("D:/p1.jpg") src2 = cv.imread("D:/p2.jpg") #加法 add_result = np.zeros(src2.shape, src2.dtype) cv.add(src,src2,add_result) cv.imshow("add-result",add_result) #減法 sub_result = np.zeros(src2.shape, src2.dtype) cv.subtract(src,src2,sub_result) cv.imshow("sub_result",sub_result) #乘法 mul_result = np.zeros(src2.shape, src2.dtype) cv.multiply(src,src2,mul_result) cv.imshow("mul_result",mul_result) #除法 div_result = np.zeros(src2.shape,src2.dtype) cv.divide(src,src2,div_result) cv.imshow("div_result",div_result)
cv.add()? 加法? ;cv.subtract()? 減法? ;cv.multiply()? 乘法? ;cv.divide()? 除法
這些像素級的圖像計算函數共通的,前兩個參數為需要參與計算的兩張圖像,最后一個參數是輸出的圖像。通常我們會用 np.zeros 函數創建一個新的空圖像。然后再放進函數中去
五:像素邏輯運算
#邏輯運算 dst1 = cv.bitwise_and(src, src2)#與運算 dst2 = cv.bitwise_xor(src, src2)#異或運算 dst3 = cv.bitwise_or(src, src2) #或運算 cv.imshow("dst1", dst1) cv.imshow("dst2", dst2) cv.imshow("dst3", dst3)
cv.bitwise主要有四種邏輯運算函數? ?cv.bitwise_and(按位與)? cv.bitwise_not(非運算)? cv.bitwise_xor(異或運算)? cv.bitwise_or(或運算)
這些像素級的圖像計算函數共通的,兩個參數為參與運算的兩個圖像變量。然后用 “=” 號承接圖像即可。
AI OpenCV Python 機器視覺
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。