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)