1. 程式人生 > >Python 影象處理 OpenCV (1):入門

Python 影象處理 OpenCV (1):入門

![](https://cdn.geekdigging.com/opencv/opencv_header.png) ## 引言 又開一個新的系列分享,對影象處理感興趣的同學可以關注這個系列。 更新頻率儘量保持一週兩到三次推送。 新系列第一件事兒當然是資源推薦,下面是一些有關 OpenCV 的資源連結: **資源連結**: * 官方網站:https://opencv.org/ * GitHub:https://github.com/opencv/opencv * 官方文件:https://docs.opencv.org/ * 中文文件(非官方):http://www.woshicver.com/ * 官方 Demo :https://github.com/opencv/opencv/blob/master/samples/python **圖書推薦** 圖書的話我就推薦一本吧,如果要看書學習絕對不能錯過的「Learning OpenCV 3」,當然,是英文原版的,中文版的話翻譯有點慘不忍睹,對英文閱讀壓力大的同學可以中英文對照著看: ![](https://cdn.geekdigging.com/opencv/01/book_opencv3_en.jpg) ## 安裝 OpenCV 在 Python 中有兩個類庫,一個是 `opencv-python` ,另一個是 `opencv-contrib-python` 。 `opencv-python` 是隻包含了主要模組的包,而 `opencv-contrib-python` 包含了主要模組以及一些擴充套件模組,帶一些收費或者專利的演算法,還有一些比較新的演算法的高階版本。 安裝的時候選擇自己喜歡的版本裝就好了,命令如下: ```shell # opencv-python 安裝命令 pip install opencv-python # opencv-contrib-python pip install opencv-contrib-python ``` 安裝完成後可以通過以下程式碼檢視安裝的版本資訊: ```python import cv2 as cv # 檢視版本資訊 print(cv.getVersionString()) # 輸出結果 4.2.0 ``` 我這裡的環境為: * Python:3.7.4 * opencv-python:4.2.0 ## 影象的基礎知識 影象都是由畫素( pixel )構成的,就像下面的這種小方格: ![](https://cdn.geekdigging.com/opencv/01/xiangsutu.jpg) 這些小方格每一個都有自己明確的位置和被分配的色彩值,而這些小方格的顏色和位置就決定了這個影象所呈現出來的樣子。 畫素是影象中最小的單位,每一個點陣影象包含了一定量的畫素,這些畫素決定影象在螢幕上所呈現的大小。 影象通常包括有 **二值影象** 、 **灰度影象** 和 **彩色影象** 。 ![](https://cdn.geekdigging.com/opencv/01/tuxiang.png) ### 二值影象 二值影象就是在影象中,任何一個點非黑即白,畫素要麼為 255 (白色) 要麼為 0 (黑色) 。轉換的時候一般將畫素 >=127 的設定為白色,其餘的設定為黑色。 ![](https://cdn.geekdigging.com/opencv/01/binary_img.png) ### 灰度影象 灰度影象是除了黑白之外,還添加了第三種顏色:灰色,灰色把灰度劃分為 256 個不同的亮度,例如純白色,它的亮度級別是255。 影象轉化為灰度影象有以下幾種演算法: * 浮點演算法:Gray = R * 0.3 + G * 0.59 + B * 0.11 * 整數方法:Gray = ( R * 30 + G * 59 + B * 11 ) / 100 * 移位方法:Gray = ( R * 76 + G * 151 + B * 28 ) >> 8 * 平均值法:Gray = ( R + G + B ) / 3 * 僅取綠色:Gray = G * 加權平均值演算法:R = G = B = R * 0.299 + G * 0.587 + B * 0.144 ![](https://cdn.geekdigging.com/opencv/01/gray_img.png) ### 彩色影象 彩色影象是RGB影象,RGB表示紅、綠、藍三原色,計算機裡所有顏色都是三原色不同比例組成的,即三色通道。 ### 常用影象示例程式碼 上面這三種影象的示例程式碼如下: ```python import cv2 as cv # 讀取影象 img = cv.imread("maliao.jpg", cv.IMREAD_COLOR) cv.imshow("read_img", img) # 灰度影象 img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY) cv.imshow("gray_img",img_gray) # 二值影象 ret, binary = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY) cv.imshow("binary_img", binary) cv.waitKey() ``` ## OpenCV 入門 ### 1. 讀入影象 讀取影象是通過函式 `cv.imread()` 實現。 語法: ```python img = cv.imread(檔名,[,引數]) ``` 第二個引數是一個標誌,它指定了讀取影象的方式。 * cv.IMREAD_COLOR: 載入彩色影象,任何影象的透明度都會被忽視,如果不傳引數,這個值是預設值。 * cv.IMREAD_GRAYSCALE:以灰度模式載入影象。 * cv.IMREAD_UNCHANGED:載入影象,包括alpha通道 > 注意:這三個標誌可以簡化為 1 、 0 、 -1 。 ### 2. 顯示影象 顯示影象是通過函式 `cv.imshow()` 函式實現。 語法: ```python cv.imshow(視窗名, 影象名) ``` ### 3. 視窗等待 顯示影象是通過函式 `cv.waitKey(delay)` 函式實現。 語法: ```python cv.waitKey(delay) ``` `cv.waitKey()` 是一個鍵盤繫結函式。其引數是以毫秒為單位的時間。該函式等待任何鍵盤事件指定的毫秒。如果您在這段時間內按下任何鍵,程式將繼續執行。如果 0 被傳遞,它將無限期地等待一次敲擊鍵。 ### 4. 刪除視窗 呼叫函式如下: ```python cv.destroyAllWindows() 刪除所有視窗 cv.destroyWindows() 刪除指定的視窗 ``` ### 5. 寫入影象 呼叫函式如下: ```python cv.imwrite(檔案地址, 檔名) ``` ### 程式碼示例 我們讀取一張圖片,將這張圖片顯示出來後,再將這張圖片儲存起來。 ```python import cv2 as cv # 讀取圖片 img = cv.imread("maliao.jpg", 1) # 顯示圖片 cv.imshow("demo", img) # 等待輸入 cv.waitKey(0) cv.destroyAllWindows() # 圖片寫入 cv.imwrite("demo.jpg", img) ``` ![](https://cdn.geekdigging.com/opencv/01/demo1.png) 這裡需要注意的是 `cv.waitKey(0)` 必須要加,如果不等待輸入,整個窗體將會一閃而過。 ## 示例程式碼 如果有需要獲取原始碼的同學可以在公眾號回覆「OpenCV」進行獲取。 ## 參考 https://blog.csdn.net/Eastmount/article/details/81748802 http://woshic