引言
又開一個新的系列分享,對影像處理感興趣的同學可以關注這個系列。
更新頻率儘量保持一週兩到三次推送。
新系列第一件事兒當然是資源推薦,下面是一些有關 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」,當然,是英文原版的,中文版的話翻譯有點慘不忍睹,對英文閱讀壓力大的同學可以中英文對照著看:
安裝
OpenCV 在 Python 中有兩個類庫,一個是 opencv-python
,另一個是 opencv-contrib-python
。
opencv-python
是隻包含了主要模組的包,而 opencv-contrib-python
包含了主要模組以及一些擴充套件模組,帶一些收費或者專利的演算法,還有一些比較新的演算法的高階版本。
安裝的時候選擇自己喜歡的版本裝就好了,命令如下:
# opencv-python 安裝命令
pip install opencv-python
# opencv-contrib-python
pip install opencv-contrib-python
安裝完成後可以通過以下程式碼檢視安裝的版本資訊:
import cv2 as cv
# 檢視版本資訊
print(cv.getVersionString())
# 輸出結果
4.2.0
我這裡的環境為:
- Python:3.7.4
- opencv-python:4.2.0
影像的基礎知識
影像都是由畫素( pixel )構成的,就像下面的這種小方格:
這些小方格每一個都有自己明確的位置和被分配的色彩值,而這些小方格的顏色和位置就決定了這個影像所呈現出來的樣子。
畫素是影像中最小的單位,每一個點陣影像包含了一定量的畫素,這些畫素決定影像在螢幕上所呈現的大小。
影像通常包括有 二值影像 、 灰度影像 和 彩色影像 。
二值影像
二值影像就是在影像中,任何一個點非黑即白,畫素要麼為 255 (白色) 要麼為 0 (黑色) 。轉換的時候一般將畫素 >=127 的設定為白色,其餘的設定為黑色。
灰度影像
灰度影像是除了黑白之外,還新增了第三種顏色:灰色,灰色把灰度劃分為 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
彩色影像
彩色影像是RGB影像,RGB表示紅、綠、藍三原色,計算機裡所有顏色都是三原色不同比例組成的,即三色通道。
常用影像示例程式碼
上面這三種影像的示例程式碼如下:
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()
實現。
語法:
img = cv.imread(檔名,[,引數])
第二個引數是一個標誌,它指定了讀取影像的方式。
- cv.IMREAD_COLOR: 載入彩色影像,任何影像的透明度都會被忽視,如果不傳引數,這個值是預設值。
- cv.IMREAD_GRAYSCALE:以灰度模式載入影像。
- cv.IMREAD_UNCHANGED:載入影像,包括alpha通道
注意:這三個標誌可以簡化為 1 、 0 、 -1 。
2. 顯示影像
顯示影像是通過函式 cv.imshow()
函式實現。
語法:
cv.imshow(視窗名, 影像名)
3. 視窗等待
顯示影像是通過函式 cv.waitKey(delay)
函式實現。
語法:
cv.waitKey(delay)
cv.waitKey()
是一個鍵盤繫結函式。其引數是以毫秒為單位的時間。該函式等待任何鍵盤事件指定的毫秒。如果您在這段時間內按下任何鍵,程式將繼續執行。如果 0 被傳遞,它將無限期地等待一次敲擊鍵。
4. 刪除視窗
呼叫函式如下:
cv.destroyAllWindows() 刪除所有視窗
cv.destroyWindows() 刪除指定的視窗
5. 寫入影像
呼叫函式如下:
cv.imwrite(檔案地址, 檔名)
程式碼示例
我們讀取一張圖片,將這張圖片顯示出來後,再將這張圖片儲存起來。
import cv2 as cv
# 讀取圖片
img = cv.imread("maliao.jpg", 1)
# 顯示圖片
cv.imshow("demo", img)
# 等待輸入
cv.waitKey(0)
cv.destroyAllWindows()
# 圖片寫入
cv.imwrite("demo.jpg", img)
這裡需要注意的是 cv.waitKey(0)
必須要加,如果不等待輸入,整個窗體將會一閃而過。
示例程式碼
如果有需要獲取原始碼的同學可以在公眾號回覆「OpenCV」進行獲取。