做計算機視覺無論如何都繞不開的一個框架就是OpenCV,可以毫不誇張地說,github上每個開源的視覺專案的安裝列表中都有OpenCV框架。很多人第一次接觸OpenCV都是從OpenCV-Python版本SDK開始的,本文就以最新版本的OpenCV4.1.0為例,透過程式碼帶領大家簡單粗暴的入門OpenCV-Python程式設計實踐。
安裝OpenCV-Python
只需要執行如下一條命令列即可
pip install opencv-python
如果想連擴充套件模組一起安裝,執行如下命令列
pip install opencv-contrib-python
更多請參考這裡
https://pypi.org/project/opencv-python/
程式碼演示部分
涵蓋OpenCV影象處理最高頻次使用API與常見各種使用技巧。
匯入CV模組
import cv2 as cvimport numpy as np
解釋:這個是因為OpenCV在python語言中的所有影象資料都是以numpy的陣列形式組織儲存。所以必須安裝numpy依賴支援,匯入以備後用。
載入與現實影象
src = cv.imread("D:/images/lena.jpg")cv.namedWindow("input", cv.WINDOW_AUTOSIZE)cv.imshow("input", src)
解釋:千萬別給中文路徑,不支援的,預設載入影象彩色,通道順序BGR。
轉換為灰度
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)cv.imshow("gray", gray)print(src.shape)print(gray.shape)
解釋:支援各種色彩空間轉換,可以轉換到灰度,HSV、YCrCb、LAB等常見色彩空間,影象的寬、高、通道數,可以透過src.shape得到。
建立空白影象
black = np.zeros_like(src)cv.imshow("black", black)
解釋:建立一張與src大小與資料型別一致的影象,但是畫素值全部為0,黑色背景影象。
調節亮度
black[:,:,:] = 50lighter = cv.add(src, black)darker = cv.subtract(src, black)cv.imshow("lightness", lighter)cv.imshow("darkness", darker)
解釋:過畫素操作實現影象亮度調整,本質是調整影象的RGB值
調節對比度
dst = cv.addWeighted(src, 1.2, black, 0.0, 0)cv.imshow("contrast", dst)
解釋:透過權重的影象相加實現影象對比度調整,這裡要特別注意,兩幅影象的大小與資料型別必須完全一致。
放大/縮小 影象
# scaleh, w, c = src.shapedst = cv.resize(src, (h//2, w//2))cv.imshow("resize-image", dst)
解釋:影象放縮支援常見的插值方式,最近鄰,線性,雙立方等。
翻轉
# 左右翻轉dst = cv.flip(src, 1)cv.imshow("flip", dst)# 上下翻轉dst = cv.flip(src, 0)cv.imshow("flip0", dst)
解釋:影象的映象翻轉支援,水平與垂直
旋轉
M = cv.getRotationMatrix2D((w//2, h//2),45, 1)dst = cv.warpAffine(src, M, (w, h))cv.imshow("rotate", dst)
解釋:影象的旋轉支援,基於放射變換,M = 2x3的變換矩陣
色彩變換
# HSVhsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)cv.imshow("hsv", hsv)# 色彩表 - 支援14種色彩變換dst = cv.applyColorMap(src, cv.COLORMAP_AUTUMN)cv.imshow("color table", dst)
解釋:支援影象常見的14種查詢表色彩匹配與風格變化,是自帶的14種色彩濾鏡
模糊
blur = cv.blur(src, (15, 15))cv.imshow("blur", blur)
解釋:影象卷積模糊操作,卷積核大小為15x15
高斯模糊
gblur = cv.GaussianBlur(src, (0, 0), 15)cv.imshow("gaussian blur", gblur)
解釋:影象高斯模糊操作,sigma = 15
自定義濾波器
k = np.ones(shape=[5, 5], dtype=np.float32) / 25dst = cv.filter2D(src, -1, k)cv.imshow("custom blur", dst)
解釋:影象自定義濾波操作,定義不同的濾波器,得到不同的濾波效果,這裡是均值濾波,模糊操作。
高斯雙邊濾波
dst = cv.bilateralFilter(src, 0, 100, 10)cv.imshow("bi-filter", dst)
解釋:邊緣保留濾波演算法的一種,OpenCV還支援其它的邊緣保留濾波演算法。
影象梯度
dx = cv.Sobel(src, cv.CV_32F, 1, 0)dy = cv.Sobel(src, cv.CV_32F, 0, 1)dx = cv.convertScaleAbs(dx)dy = cv.convertScaleAbs(dy)cv.imshow("grad-x", dx)cv.imshow("grad-y", dy)
解釋:影象梯度提取,基於一階導數運算元Sobel
邊緣檢測
edge = cv.Canny(src, 100, 300)cv.imshow("edge", edge)
解釋:影象邊緣提取,Canny是經典的影象邊緣提取演算法。100表示低閾值,300表示高閾值。
直方圖均衡化
eh = cv.equalizeHist(gray)cv.imshow("eh", eh)
解釋:影象直方圖均衡化,是影象直方圖應用之一,其它還有直方圖匹配,直方圖相似度,直方圖反向投影等。這裡的均衡化是全域性均衡化,對應還有區域性自適應的直方圖均衡化方法。
角點檢測
corners = cv.goodFeaturesToTrack(gray, 100, 0.05, 10)# print(len(corners))for pt in corners: # print(pt) b = np.random.random_integers(0, 256) g = np.random.random_integers(0, 256) r = np.random.random_integers(0, 256) x = np.int32(pt[0][0]) y = np.int32(pt[0][1]) cv.circle(src, (x, y), 5, (int(b), int(g), int(r)), 2)cv.imshow("corners detection", src)
解釋:基於shi-tomas角點檢測演算法
二值化載入影象
src = cv.imread("D:/images/zsxq/zsxq_12.jpg")gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)cv.imshow("binary input", gray)
解釋:載入二值化操作測試影象
固定閾值
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)cv.imshow("binary", binary)
解釋:手動指定閾值為127,THRESH_BINARY表示大於127為白色,反之為黑色。
全域性閾值
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)cv.imshow("otsu", binary)
解釋:自動計算閾值,基於全域性直方圖資訊
自適應閾值
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, 25, 10)cv.imshow("ada", binary)
解釋:自適應閾值計算方法,支援高斯與盒子兩種方式。
輪廓分析
contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)result = np.zeros_like(src)for cnt in range(len(contours)): cv.drawContours(result, contours, cnt, (0, 0, 255), 2, 8)cv.imshow("contour", result)
解釋:二值影象的輪廓與結構分析API,演示,這裡只是獲取了最外層輪廓。
膨脹與腐蝕操作
se = cv.getStructuringElement(cv.MORPH_RECT, (5, 5), (-1, -1))d = cv.dilate(binary, se)e = cv.erode(binary, se)cv.imshow("dilate", d)cv.imshow("erode", e)
解釋:二值影象的形態學基礎操作,腐蝕與膨脹
開閉操作
op = cv.morphologyEx(binary, cv.MORPH_OPEN, se)cl = cv.morphologyEx(binary, cv.MORPH_CLOSE, se)cv.imshow("open", op)cv.imshow("close", cl)
解釋:二值影象的形態學組合操作,開操作與閉操作
上述全部演示程式碼的程式碼如下地址:
https://github.com/gloomyfish1998/opencv_tutorial
轉自OpenCV學堂,獨家授權。