opencv python tutorials_OpenCV-Python Tutorials 笔记(二)
OpenCV官方有一個面向python的文檔OpenCV-Python
Tutorials:
我根據此文檔進行了實踐學習,結合自己經驗簡單記錄一下筆記。(續)
4、Image Processing in
OpenCV
4.1Changing
Colorspaces
轉換顏色空間算是極其常用的操作了。不用說,cvtColor()。
相關參數:COLOR_BGR2GRAY、COLOR_BGR2HSV
等。注意這里不用 CV_BGR2GRAY了。
教程演示了一個用HSV顏色空間進行跟蹤的例子,挺有意思的。拷貝代碼:
cap = cv2.VideoCapture(0)
while(1):
# Take
each frame
_,
frame = cap.read()
#
Convert BGR to HSV
hsv =
cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
#
define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([120,255,255])
#
Threshold the HSV image to get only blue colors
mask =
cv2.inRange(hsv, lower_blue, upper_blue)
#
Bitwise-AND mask and original image
res =
cv2.bitwise_and(frame,frame, mask= mask)
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k =
cv2.waitKey(5) & 0xFF
if k ==
27:
break
cv2.destroyAllWindows()
此外,講了一下如何求出所需的HSV值。用圖像編輯軟件或者打兩行代碼都行。
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green =
cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>> print hsv_green
[[[ 60 255 255]]]
4.2?Geometric Transformations of
Images
圖像幾何變換,尺度、平移、旋轉、仿射、透視,等。需要相關的計算機視覺幾何學背景。
在推薦書目里果然看到了這本書:“Computer Vision: Algorithms and Applications”,
Richard Szeliski
尺度變換最簡單也最常用:resize()。自帶幾種算法。
Preferable interpolation methods are cv2.INTER_AREA for
shrinking and cv2.INTER_CUBIC (slow) & cv2.INTER_LINEAR for
zooming.
平移和旋轉都是仿射變換,需要確定變換矩陣。函數:cv2.warpAffine()
平移矩陣最簡單:
旋轉矩陣就要計算一下了:函數
getRotationMatrix2D()
OpenCV里為了可以確定旋轉后大小和中心位置,矩陣如下:
其中
綜合起來的時候呢,仿射變換可以由三點確定(因矩形變換后一定是平行四邊形)
只要你給出三個點在變換前后的坐標,就可以用函數getAffineTransform()計算2*3的仿射變換矩陣。
代碼:
img = cv2.imread('drawing.png')
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
dst =
cv2.warpAffine(img,M,(cols,rows))
透視變換:
getPerspectiveTransform()、warpPerspective()
透視變換矩陣是3*3的。給出四個點的坐標(任意三點不共線)可以進行計算。代碼類似仿射的。
4.3?Image Thresholding
圖像閾值化:簡單閾值化、自適應閾值化(平均、高斯)、Ostu(最大類間差/大津法)
函數:cv2.threshold, cv2.adaptiveThreshold
一張圖說明簡單閾值化的五個參數,太有用了:
ostu法這個還真沒有用過:
ret,th =
cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
后邊講了實現原理,暫不仔細看了。
4.4?Smoothing Images
圖像平滑。
二維卷積(圖像濾波操作):cv2.filter2D(),低通濾波去噪模糊,高通濾波銳化勾邊。學過圖像處理的都知道。
平滑卷積核例如:kernel
= np.ones((5,5),np.float32)/25
又如著名的拉普拉斯算子:kernel
= np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
圖像模糊/平滑有幾個函數。blur、GaussianBlur、medianBlur、bilateralFilter等
4.5Morphological
Transformations
圖像形態學處理:膨脹、腐蝕、開運算、閉運算、黑帽運算、頂帽運算、形態學梯度運算。
函數:cv2.erode(), cv2.dilate(),
cv2.morphologyEx() 等
函數調用時要緊的是構建一個核。
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
也有專門構建核的函數:getStructuringElement,自帶矩形核、橢圓核、十字核三種。
4.6?Image Gradients
圖像梯度。函數:cv2.Sobel(), cv2.Scharr(), cv2.Laplacian()
注意Sobel函數要分別求XY然后相加。
這里教程特別說明了一下類型的問題。梯度運算時如果使用CV_8U會使得負數值化為零,丟失負向梯度。因此建議使用更高精度類型如CV_64F。
其余的不再贅述。有圖像處理知識的人看看就明白了。
4.7?Canny Edge Detection
Canny 邊緣檢測。講得比較詳細。原理沒細看,代碼極其簡單。
4.8?Image Pyramids
圖像金字塔。很多算法的基礎。函數:cv2.pyrUp(),
cv2.pyrDown()
得到的是高斯金字塔,向下是縮小,向上是放大。需要拉普拉斯金字塔時做差分就行了,沒有專門函數。
教程里給了個利用六級金字塔融合圖像的例子。(調試中發現圖片需要滿足邊長能整除64。當然啦。)
看代碼里邊用到了幾個python-Numpy函數沒見過,記錄一下:
BIF:zip,就是把2個數組糅在一起:
x=[1, 2, 3, 4, 5 ]
y=[6, 7, 8, 9, 10]
zip(x, y)就得到了
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
np.hstack,橫向連接數組。vstack縱向連接。
挺洋氣,以前沒想到過圖像還可以這樣融合誒,效果還不錯,當然就是模糊了點。
4.9?Contours in OpenCV
4.9.1?Contours : Getting Started
輪廓專題。輪廓在《學習OpenCV》第一版里可是用專門一章來講的,好像挺復雜,不過我并沒怎么看過。
函數cv2.findContours(), cv2.drawContours()
(未完待續)
總結
以上是生活随笔為你收集整理的opencv python tutorials_OpenCV-Python Tutorials 笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: routing zuul_尚学堂0131
 - 下一篇: 米线店结账程序 装饰着模式_实验报告2_