一 . opencv是什么及其作用?
OpenCV是一個基於BSD許可(開源)發行的跨平台計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法(百度百科)。
鑒於本人的工作環境主要是采用python作為開發工具,故本篇博客是基於python來做的學習記錄。
二 . 環境依賴和opencv包
- 環境:python3.7+windows10
- 包:opencv-python、opencv-contrib-python
- 說明:裝好python以后,直接在cmd里面使用pip install 即可,若遇見下載速度過慢或超時的情況,建議換個pip源,使用方式如:pip install package -i https://pypi.tuna.tsinghua.edu.cn/simple/
三 . 基本使用
前提:准備若干張圖片到本地
都知道一張圖片是由很多個像素點組成,對於計算機而言,最終呈現在用戶面前的是由每個像素點的值所決定(0~255),0對應黑色,255對應白色。我們在生活中通常接觸的都是彩色圖片,由RGB三通道共同構成一張上面的彩色圖片,每一個通道對應的像素值反映出其亮度(三個通道可以理解成三個矩陣)。而灰度圖像通常只有一個顏色通道來表現。
1. 讀取圖片,將其轉換為數組
from matplotlib import pyplot as pyl import cv2 import numpy img = cv2.imread("cat.jpg") #img是一個numpy.ndarray對象,默認是以BGR三通道讀取圖片數據(三維數組)
#img_gray = cv2.imread("cat.jpg",cv2.IMREAD_GRAYSCALE) 以灰度圖像方式讀取圖片數據(二維數組)
2. 數組數據轉換
img_BGR = cv2.imread("cat.jpg") img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #將其轉換為灰度的二維數組數據
3. 數組數據窗口展示
img = cv2.imread("cat.jpg") cv2.imshow("IMage",img) cv2.waitKey(0) # 按任意鍵關閉窗口,cv2.waitKey(1000) 延時一秒關閉窗口 cv2.destroyAllWindows()
4. 圖像保存
cv2.imwrite("mycat.jpg",img)
5. 圖像的截取
# 其實本質就是對np數組進行操作 img = cv2.imread("cat.jpg") cv2.imshow("IMage",img[:100,:200]) # 取前100行,前200列的像素作為圖像展示
6. BGR數據切片
img = cv2.imread("cat.jpg") # 切片 b,g,r = cv2.split(img) # 得到各自顏色通道的二維數組數據 # 合並 img = cv2.merge(b,g,r)
7 同樣大小的數組像素值運算
img = cv2.imread("cat.jpg") img_2 = numpy.copy(img) # np相加,像素值只要超過255,就減掉255,比如257,結果就為2 print(img[:3,:3,0]+img_2[:3,:3,0] ) # cv2相加,像素值超過255,就等於255 print(cv2.add(img[:3,:3,0],img_2[:3,:3,0]))
8 圖片的融合
img_cat = cv2.imread("cat.jpg") img_dog = cv2.imread("dog.jpg") ret = cv2.addWeighted(img_cat,0.2,img_dog,0.8,0) # 數據后面的值決定圖片融合和所占的權重 cv2.imshow("IMage",ret) cv2.waitKey(0) # 按任意鍵關閉窗口,cv2.waitKey(1000) 延時一秒關閉窗口 cv2.destroyAllWindows()
# 如果圖片大小不一致,使用cv2.resize(img_xx,(300,200)) ————》轉換為np.shape = 200,300的數組
9 圖片的比例縮放
img_cat = cv2.imread("cat.jpg") ret = cv2.resize(img_cat,(0,0),fx=3,fy=1) #橫向拉長三倍 ret2 = cv2.resize(img_cat,(0,0),fx=3,fy=3) #圖片擴大三倍
結語:本來准備認真寫一下結尾的,畢竟作為博客園的新人,寫下第一篇學習筆記應當是值得紀念的一件事兒,不過想了想,這要是最后一篇那豈不是太尷尬了。嗯,作為一名不太合格的碼農,我大多時候是很抗拒寫筆記的,其實畢業工作也已經一年多了,一直也來也都知道一個好的學習習慣是多么重要。所以,我希望自己能改變的更快一點,能變得更加優秀,更加有底氣的去嘗試,去做自己覺得有意義真正想去做的事情。
—— 2019-09-10 00:14:45