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

極客挖掘機發表於2020-05-18

引言

又開一個新的系列分享,對影像處理感興趣的同學可以關注這個系列。

更新頻率儘量保持一週兩到三次推送。

新系列第一件事兒當然是資源推薦,下面是一些有關 OpenCV 的資源連結:

資源連結

圖書推薦

圖書的話我就推薦一本吧,如果要看書學習絕對不能錯過的「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」進行獲取。

參考

https://blog.csdn.net/Eastmount/article/details/81748802

http://woshicver.com/

相關文章