OpenCV之Python學習筆記(1)(2): 影象的載入、顯示和儲存 影象元素的訪問、通道分離與合併
OpenCV之Python學習筆記
一直都在用Python+OpenCV做一些演算法的原型。本來想留下發布一些文章的,可是整理一下就有點無奈了,都是寫零散不成系統的小片段。現在看到一本國外的新書《OpenCV Computer Vision with Python》,於是就看一遍,順便把自己掌握的東西整合一下,寫成學習筆記了。更需要的朋友參考。
閱讀須知:
本文不是純粹的譯文,只是比較貼近原文的筆記;
請設法購買到出版社出版的書,支援正版。
從書名就能看出來本書是介紹在Python中使用OpenCV,全書分為5章,兩個附錄:
- 第一章OpenCV設定,介紹如何在Windows、Mac和Ubuntu上設定Pyhton、OpenCV和相關庫的環境。還討論了OpenCV社群、OpenCV文件以及官方的示例程式碼。
- 第二章處理檔案、攝像頭和GUI,討論OpenCV的I/O功能,接著使用物件導向的設計編寫一個主應用程式,用於顯示攝像頭實時場景、處理鍵盤輸入、將攝像頭寫入視訊檔案和靜態影象檔案。
- 第三章影象過濾,介紹使用OpenCV、NumPy和SciPy來編寫影象過濾器。過濾器可用於線性顏色操作、曲線顏色操作、模糊化、銳化和尋找邊緣。本章修改第一章的主程式,將過濾器應用到實時攝像頭場景中。
- 第四章使用Haar Cascades追蹤人臉,本章將編寫一個層次化的人臉追蹤器,使用OpenCV定點陣圖像中的臉部、眼睛、鼻子和嘴巴。同時還編寫了用於複製和改變影象中某塊區域的大小。同樣,本章也將修改之前的主應用程式,讓其可以用於找到並處理攝像頭場景中的人臉。
- 第五章檢測前景/背景區域和深度。通過本章將瞭解有關OpenCV(在OpenNI和SensorKinect的支援下)從深度攝像頭中獲得的資料型別的資訊。接著編寫一些函式,使用這些資料對前景區域施加一些限制效果。最後將這些函式整合到主程式中,使得在處理人臉之前先進行細化操作。
- 附錄A,與Pygame整合。修改主程式,用Pygame替換OpenCV來處理特定的I/O事件。(Pygame提供了更多樣的事件處理函式。)
- 附錄B,為自定義目標生成Haar Cascades,允許我們檢測一系列的OpenCV工具,來對任何型別的目標或模式構建跟蹤器,而不僅僅是人臉。
本書第一章是介紹在不同作業系統上對OpenCV、Python及相關庫的配置,這裡就不介紹了。下一篇文章將直接從第二章開始介紹。
OpenCV Python教程(1、影象的載入、顯示和儲存)
本文是OpenCV 2 Computer Vision Application Programming Cookbook讀書筆記的第一篇。在筆記中將以Python語言改寫每章的程式碼。
PythonOpenCV的配置這裡就不介紹了。
注意,現在OpenCV for Python就是通過NumPy進行繫結的。所以在使用時必須掌握一些NumPy的相關知識!
影象就是一個矩陣,在OpenCV for Python中,影象就是NumPy中的陣列!
如果讀取影象首先要匯入OpenCV包,方法為:
- import cv2
讀取並顯示影象
在Python中不需要宣告變數,所以也就不需要C++中的cv::Mat xxxxx了。只需這樣:
- img = cv2.imread("D:\cat.jpg")
OpenCV目前支援讀取bmp、jpg、png、tiff等常用格式。更詳細的請參考OpenCV的參考文件。
接著建立一個視窗
- cv2.namedWindow("Image")
然後在視窗中顯示影象
- cv2.imshow("Image", img)
最後還要添上一句:
- cv2.waitKey (0)
如果不添最後一句,在IDLE中執行視窗直接無響應。在命令列中執行的話,則是一閃而過。
完整的程式為:
- import cv2
- img = cv2.imread("D:\\cat.jpg")
- cv2.namedWindow("Image")
- cv2.imshow("Image", img)
- cv2.waitKey (0)
- cv2.destroyAllWindows()
建立/複製影象
新的OpenCV的介面中沒有CreateImage介面。即沒有cv2.CreateImage這樣的函式。如果要建立影象,需要使用numpy的函式(現在使用OpenCV-Python繫結,numpy是必裝的)。如下:
- emptyImage = np.zeros(img.shape, np.uint8)
也可以複製原有的影象來獲得一副新影象。
- emptyImage2 = img.copy();
- emptyImage3=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- #emptyImage3[...]=0
儲存影象
儲存影象很簡單,直接用cv2.imwrite即可。
cv2.imwrite("D:\\cat2.jpg", img)
第一個引數是儲存的路徑及檔名,第二個是影象矩陣。其中,imwrite()有個可選的第三個引數,如下:
cv2.imwrite("D:\\cat2.jpg", img,[int(cv2.IMWRITE_JPEG_QUALITY), 5])
第三個引數針對特定的格式: 對於JPEG,其表示的是影象的質量,用0-100的整數表示,預設為95。 注意,cv2.IMWRITE_JPEG_QUALITY型別為Long,必須轉換成int。下面是以不同質量儲存的兩幅圖:
對於PNG,第三個參數列示的是壓縮級別。cv2.IMWRITE_PNG_COMPRESSION,從0到9,壓縮級別越高,影象尺寸越小。預設級別為3:
- cv2.imwrite("./cat.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
- cv2.imwrite("./cat2.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
還有一種支援的影象,一般不常用。
完整的程式碼為:
- import cv2
- import numpy as np
- img = cv2.imread("./cat.jpg")
- emptyImage = np.zeros(img.shape, np.uint8)
- emptyImage2 = img.copy()
- emptyImage3=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- #emptyImage3[...]=0
- cv2.imshow("EmptyImage", emptyImage)
- cv2.imshow("Image", img)
- cv2.imshow("EmptyImage2", emptyImage2)
- cv2.imshow("EmptyImage3", emptyImage3)
- cv2.imwrite("./cat2.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 5])
- cv2.imwrite("./cat3.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
- cv2.imwrite("./cat.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
- cv2.imwrite("./cat2.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
- cv2.waitKey (0)
- cv2.destroyAllWindows()
參考資料:
《OpenCV References Manuel》
《OpenCV 2 Computer Vision Application Programming Cookbook》
《OpenCV Computer Vision with Python》
OpenCV Python教程(2、影象元素的訪問、通道分離與合併)
OpenCV Python教程之影象元素的訪問、通道分離與合併
轉載請詳細註明原作者及出處,謝謝!
訪問畫素
畫素的訪問和訪問numpy中ndarray的方法完全一樣,灰度圖為:
- img[j,i] = 255
- img[j,i,0]= 255
- img[j,i,1]= 255
- img[j,i,2]= 255
下面通過對影象新增人工的椒鹽現象來進一步說明OpenCV Python中需要注意的一些問題。完整程式碼如下:
- import cv2
- import numpy as np
- def salt(img, n):
- for k in range(n):
- i = int(np.random.random() * img.shape[1]);
- j = int(np.random.random() * img.shape[0]);
- if img.ndim == 2:
- img[j,i] = 255
- elif img.ndim == 3:
- img[j,i,0]= 255
- img[j,i,1]= 255
- img[j,i,2]= 255
- return img
- if __name__ == '__main__':
- img = cv2.imread("影象路徑")
- saltImage = salt(img, 500)
- cv2.imshow("Salt", saltImage)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
上面的程式碼需要注意幾點:
1、與C++不同,在Python中灰度圖的img.ndim = 2,而C++中灰度圖影象的通道數img.channel() =1
2、為什麼使用np.random.random()?
這裡使用了numpy的隨機數,Python自身也有一個隨機數生成函式。這裡只是一種習慣,np.random模組中擁有更多的方法,而Python自帶的random只是一個輕量級的模組。不過需要注意的是np.random.seed()不是執行緒安全的,而Python自帶的random.seed()是執行緒安全的。如果使用隨機數時需要用到多執行緒,建議使用Python自帶的random()和random.seed(),或者構建一個本地的np.random.Random類的例項。
分離、合併通道
由於OpenCV Python和NumPy結合的很緊,所以即可以使用OpenCV自帶的split函式,也可以直接操作numpy陣列來分離通道。直接法為:
- import cv2
- import numpy as np
- img = cv2.imread("D:/cat.jpg")
- b, g, r = cv2.split(img)
- cv2.imshow("Blue", r)
- cv2.imshow("Red", g)
- cv2.imshow("Green", b)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- b = cv2.split(img)[0]
- g = cv2.split(img)[1]
- r = cv2.split(img)[2]
也可以直接操作NumPy陣列來達到這一目的:
- import cv2
- import numpy as np
- img = cv2.imread("D:/cat.jpg")
- b = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
- g = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
- r = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
- b[:,:] = img[:,:,0]
- g[:,:] = img[:,:,1]
- r[:,:] = img[:,:,2]
- cv2.imshow("Blue", r)
- cv2.imshow("Red", g)
- cv2.imshow("Green", b)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- >>> c= np.zeros(img.shape, dtype=img.dtype)
- >>> c[:,:,:] = img[:,:,:]
- >>> d[:,:,:] = img[:,:,:]
- >>> c is a
- False
- >>> d is a
- False
- >>> c.base is a
- False
- >>> d.base is a #注意這裡!!!
- True
通道合併
同樣,通道合併也有兩種方法。第一種是OpenCV自帶的merge函式,如下:
- merged = cv2.merge([b,g,r]) #前面分離出來的三個通道
- mergedByNp = np.dstack([b,g,r])
- merged = cv2.merge([b,g,r])
- print "Merge by OpenCV"
- print merged.strides
- mergedByNp = np.dstack([b,g,r])
- print "Merge by NumPy "
- print mergedByNp.strides
- Merge by OpenCV
- (1125, 3, 1)
- Merge by NumPy
- (1, 500, 187500)
- >>> a = np.arange(6)
- >>> a
- array([0, 1, 2, 3, 4, 5])
- >>> a.strides
- (4,)
同樣,2維陣列如下:
- >>> b = np.arange(12).reshape(3,4)
- >>> b
- array([[ 0, 1, 2, 3],
- [ 4, 5, 6, 7],
- [ 8, 9, 10, 11]])
- >>> b.strides
- (16, 4)
下面來看下3維陣列:
- >>> c = np.arange(27).reshape(3,3,3)
- array([[[ 0, 1, 2],
- [ 3, 4, 5],
- [ 6, 7, 8]],
- [[ 9, 10, 11],
- [12, 13, 14],
- [15, 16, 17]],
- [[18, 19, 20],
- [21, 22, 23],
- [24, 25, 26]]])
- >>> c.strides
- (36, 12, 4)
- import cv2
- import numpy as np
- img = cv2.imread("D:/cat.jpg")
- b = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
- g = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
- r = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
- b[:,:] = img[:,:,0]
- g[:,:] = img[:,:,1]
- r[:,:] = img[:,:,2]
- merged = cv2.merge([b,g,r])
- print "Merge by OpenCV"
- print merged.strides
- print merged
- mergedByNp = np.dstack([b,g,r])
- print "Merge by NumPy "
- print mergedByNp.strides
- print mergedByNp
- cv2.imshow("Merged", merged)
- cv2.imshow("MergedByNp", merged)
- cv2.imshow("Blue", b)
- cv2.imshow("Red", r)
- cv2.imshow("Green", g)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
from: http://blog.csdn.net/sunny2038/article/category/904451
相關文章
- 利用opencv合併影象OpenCV
- OpenCV成長之路(1):影象的讀寫與顯示OpenCV
- opencv學習筆記(二)-- 載入、修改和儲存影像OpenCV筆記
- 影象拼接基礎學習筆記筆記
- 【OpenCV】訪問Mat影象中每個畫素的值OpenCV
- opencv 影像的 ROI、通道的拆分與合併OpenCV
- OpenCV imshow()之後沒有waitKey()無法顯示影象OpenCVAI
- 【OpenCV學習】影象卷積濾波OpenCV卷積
- [PyTorch 學習筆記] 7.1 模型儲存與載入PyTorch筆記模型
- Python-OpenCV 處理影象(二):濾鏡和影象運算PythonOpenCV
- 小強學Python+OpenCV之-1.2影象基礎PythonOpenCV
- CSS筆記-2:元素的顯示模式CSS筆記模式
- Python-OpenCV 處理影象(四):影象直方圖和反向投影PythonOpenCV直方圖
- 【numpy學習筆記】陣列的儲存和下載筆記陣列
- LevelDB 學習筆記2:合併筆記
- CSS 小結筆記之元素的隱藏與顯示CSS筆記
- Python-OpenCV 處理影象(三):影象畫素點操作PythonOpenCV
- [Python影象處理] 六.影象縮放、影象旋轉、影象翻轉與影象平移Python
- Python-OpenCV 處理影象(五):影象中邊界和輪廓檢測PythonOpenCV
- 【OpenCV學習】計算兩幅影象的重疊區域OpenCV
- Python-OpenCV 處理影象(七):影象灰度化處理PythonOpenCV
- Python-OpenCV 處理影象(八):影象二值化處理PythonOpenCV
- [Python影象處理] 八.影象腐蝕與影象膨脹Python
- 影象二值化(python+opencv)PythonOpenCV
- [Python影象處理] 一.影象處理基礎知識及OpenCV入門函式PythonOpenCV函式
- CUDA 學習筆記之儲存器筆記
- 深入學習OpenCV檢測及分割影象的目標區域OpenCV
- 2.影像的載入與儲存
- 立體視覺影象對,獲取與儲存視覺
- MySQL學習筆記之啟動停止與登入,顯示相關資訊MySql筆記
- opencv中的影象形態學——腐蝕膨脹OpenCV
- 【筆記】基於Python的數字影象處理筆記Python
- OpenCV&&python_影象平滑(Smoothing Images)OpenCVPython
- DICOM醫學影象處理:DICOM儲存操作之“多幅BMP影象資料存入DCM檔案”
- 使用HTML5 IndexDB儲存影象和檔案HTMLIndex
- 基於 OpenCV 的影象匹配( Java 版)OpenCVJava
- Opencv-Python 影象透視變換cv2.warpPerspectiveOpenCVPython
- Python OpenCV Tutorial Introduction影象處理教程PythonOpenCV