別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

做計算機視覺無論如何都繞不開的一個框架就是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 cv
import 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。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

轉換為灰度

gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow("gray", gray)
print(src.shape)
print(gray.shape)

解釋:支持各種色彩空間轉換,可以轉換到灰度,HSV、YCrCb、LAB等常見色彩空間,圖像的寬、高、通道數,可以通過src.shape得到。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

創建空白圖像

black = np.zeros_like(src)
cv.imshow("black", black)

解釋:創建一張與src大小與數據類型一致的圖像,但是像素值全部為0,黑色背景圖像。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

調節亮度

black[:,:,:] = 50
lighter = cv.add(src, black)
darker = cv.subtract(src, black)
cv.imshow("lightness", lighter)
cv.imshow("darkness", darker)

解釋:過像素操作實現圖像亮度調整,本質是調整圖像的RGB值

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

調節對比度

dst = cv.addWeighted(src, 1.2, black, 0.0, 0)
cv.imshow("contrast", dst)

解釋:通過權重的圖像相加實現圖像對比度調整,這里要特別注意,兩幅圖像的大小與數據類型必須完全一致。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

放大/縮小 圖像

# scale
h, w, c = src.shape
dst = 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)

解釋:圖像的鏡像翻轉支持,水平與垂直

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

旋轉

M = cv.getRotationMatrix2D((w//2, h//2),45, 1)
dst = cv.warpAffine(src, M, (w, h))
cv.imshow("rotate", dst)

解釋:圖像的旋轉支持,基於放射變換,M = 2×3的變換矩陣

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

色彩變換

# HSV
hsv = 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種色彩濾鏡

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

模糊

blur = cv.blur(src, (15, 15))
cv.imshow("blur", blur)

解釋:圖像卷積模糊操作,卷積核大小為15×15

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

高斯模糊

gblur = cv.GaussianBlur(src, (0, 0), 15)
cv.imshow("gaussian blur", gblur)

解釋:圖像高斯模糊操作,sigma = 15

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

自定義濾波器

k = np.ones(shape=[5, 5], dtype=np.float32) / 25
dst = cv.filter2D(src, -1, k)
cv.imshow("custom blur", dst)

解釋:圖像自定義濾波操作,定義不同的濾波器,得到不同的濾波效果,這里是均值濾波,模糊操作。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

高斯雙邊濾波

dst = cv.bilateralFilter(src, 0, 100, 10)
cv.imshow("bi-filter", dst)

解釋:邊緣保留濾波算法的一種,OpenCV還支持其它的邊緣保留濾波算法。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

圖像梯度

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

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

邊緣檢測

edge = cv.Canny(src, 100, 300)
cv.imshow("edge", edge)

解釋:圖像邊緣提取,Canny是經典的圖像邊緣提取算法。100表示低閾值,300表示高閾值。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

直方圖均衡化

eh = cv.equalizeHist(gray)
cv.imshow("eh", eh)

解釋:圖像直方圖均衡化,是圖像直方圖應用之一,其它還有直方圖匹配,直方圖相似度,直方圖反向投影等。這里的均衡化是全局均衡化,對應還有局部自適應的直方圖均衡化方法。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

角點檢測

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角點檢測算法

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

二值化加載圖像

src = cv.imread("D:/images/zsxq/zsxq_12.jpg")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow("binary input", gray)

解釋:加載二值化操作測試圖像

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

固定閾值

ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
cv.imshow("binary", binary)

解釋:手動指定閾值為127,THRESH_BINARY表示大於127為白色,反之為黑色。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

全局閾值

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)

解釋:自適應閾值計算方法,支持高斯與盒子兩種方式。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎API

輪廓分析

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,演示,這里只是獲取了最外層輪廓。

別不信,100行代碼,帶你玩轉OpenCV-Python基礎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
來源:kknews別不信,100行代碼,帶你玩轉OpenCV-Python基礎API