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()
(未完待续)