首頁>技術>

做計算機視覺無論如何都繞不開的一個框架就是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學堂,獨家授權。

33
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Gin 實戰(二)| 簡便的Restful API 實現