Python 影象處理 OpenCV (1):入門
阿新 • • 發佈:2020-05-18
![](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