1.入门基本api

1.图像读取 imread

  1. retval = cv2.imread( filename [, flags])
  • retval 是返回值,其值是读取到的图像。如果未读取到图像,则返回“None”
  • filename 表示要读取的图像的完整文件名
  • flags 是读取标记。该标记用来控制读取文件的类型 | 值 | 含义 | 数值 | | —- | —- | —- | | cv2.IMREAD_COLOR | 将图像调整为3通道的BGR图像。这是默认值 | 1 | | cv2.IMREAD_GRAYSCALE | 以灰色模式加载图像 | 0 | | cv2.IMREAD_UNCHANGED | 保持原格式不变 | -1 | | 详细见书P3-4 | | |

2.图像显示 imshow

  1. None = cv2.imshow( 窗口名称,图像)
  2. key = cv2.waitkey(0) #这个0,是表示一直停在界面无限等待

其中waitkey里的参数,不写就是键盘按什么返回什么
key == ord(’ A ‘) 可以用ord将键盘转换为ASCII码去跟返回的值比较

3.保存图像

  1. retval = cv2.imwrite( filename, img[, params])
  • retval 是返回值,保存成功True,反之False
  • filename 表示要保存的图像的完整文件名.拓展名
  • img 是被保存图像的名称
  • params 保存类型参数,可选

2.图像处理

3.图像运算

加号运算

使用“+”运算,图像a,图像b,公式

opencv 轻松入门学习 api总结 - 图1

cv2.add

两个加起来,超过255,那就是取255

cv2.addWeighted >>书P40

  1. dst = cv2.addweighted(src1, alpha, src2, beta, gamma)

图1,图1权重,图2,图2权重,混合图片亮度

逻辑运算 与或非 >>P43

  1. cv2.bitwise_and() # 与
  2. cv2.bitwise_or() #或
  3. cv2.bitwise_xor() #按位异或
  4. cv2.bitwise_not #按位取反

4.色彩空间

1.cvtColor >>P83

  1. cv2.cvtColor( src, code [, dstCn])

2.inRange >>P97

  1. dst = cv2.inRange( src, lowerb, upperb)

5.几何变换

1.缩放 cv2.resize P106

  1. dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]])
  • dsize 代表输出图像大小
  • fx 代表水平方向的缩放比例
  • fy 代表垂直方向的缩放比例
  • interpolation 代表插值方式 见书

2.翻转 cv2.flip P110

  1. # filpCode 翻转类型,x轴 0,/ y轴 正数 / xy同时,负数
  2. dst = cv2.flip( src, filpCode)

3.仿射 cv2.warpAffine P111

  1. dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]])
  • M 代表一个2x3的变换矩阵。不同的矩阵不同的效果

    旋转 P113

    1. 可以用cv2.getRotationMatrix2D( center, angle, scale)去生成M

    负责的仿射 P114

    1. # M生成
    2. retval = cv2.getAffineTransform( sec, dst)

    4.透视 cv2.warpPerspective P115

    1. dst = cv2.warpPerspective( src, M, dsize[, flags[, borderMode[, borderValue]]])

5.重映射 cv2.remap P117

  1. dst = cv2.remap( src, map1, map2, interpolation[, borderMode[, borderValue]])

此函数功能可以复制P119,翻转P121,xy轴互换P126

6.阈值处理

1.cv2.threshold P130

  1. retval, dst = cv2.threshold( src, thresh, maxval, type)
  • retval 代表返回的阈值
  • thresh,maxval 两个阈值
  • type 常用参数,cv2.THRESH_RINARY,可以用0表示,二值化处理 其他见书
  • type 要是 cv2.THRESH_RINARY + cv2.THRESH_OTSU,就是会自动计算最优阈值,并且返回计算的阈值大小,P141有介绍

2.自适应阈值 cv2.adaptiveThreshold P139

  1. dst = cv2.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, c)
  • maxValue 最大值
  • adaptiveMethod 自适应方法
  • thresholdType 阈值处理方式,必须是cv2.THRESH_BINARY,cv2.THRESH_BINARY_INV其中一个
  • blockSize 块的大小。表示一个像素在计算其阈值时所用的领域尺寸,一般为3,5,7

7.图像平滑处理

1.均值滤波cv2.blur P150

  1. dst = cv2.blur( src, ksize, anchor, borderType)
  • ksize 是滤波核的大小。滤波核大小指在均值处理过程中,其领域图像的高度和宽度。其指可以是(5,5)
  • anchor 是锚点,默认值是(-1,-1),表示当前计算均值的点位于核的中间点位置

    2.方框滤波 cv2.boxFilter P152

    1. dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType)
  • ddepth 处理图像的深度,一般-1,表示与原始图像使用相同的图像深度

  • ksize 是滤波核大小
  • normalize 表示在滤波时是否进行归一化,1表示进行归一化,要用领域像素值的和除以面积,0不用,但可能因为加起来的值大于255,数值截断,画面变成白色的了

3.高斯滤波 cv2.GaussianBlur P158

  1. dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType)
  • sigmaX 是卷积核在水平方向上(x轴方向)的标准差,其控制的是权重比例(参数必须要)
  • sigmaY 是卷积核在垂直方向上(Y轴方向)的标准差,如果为0,则只才用sigmaX

    4.中值滤波 cv2.medianBlur P161

    1. # 去噪效果很好
    2. dst = cv2.medianBlur( src, ksize)
  • ksize 滤波核大小,必须是单数且大于1,如3,5,7

    5.双边滤波 cv2.bilateralFilter P164

    1. dst = cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace, borderType)
  • d 是滤波时选取的空间距离参数,表示以当前像素点为中心点的直径,推荐用d=5,较大噪声可以用9

    6.2D卷积 cv2.filter2D P166

    1. dst = cv2.filter2D( src, ddepth, kernel, anchor, delta, borderType)
  • kernel 是卷积核,是一个单通道的数组。要是想在彩色通道使用,就得拆分通道一个一个处理

  • dalta 修正值

    8.形态学操作

    1.腐蚀cv2.erode P170

    1. dst = cv2.erode( srrc, kernel[, anchor[, iterations[, borderType[, borderValue]]]])
  • iterations 腐蚀操作迭代次数,默认1

    2.膨胀 cv2.dilate P176

    1. dst = cv2.dilate( src, kernel[, anchor[, iterations[, borderType[, borderValue]]]])

    3.通用形态学函数 cv2.morphologyEx P178

    1. dst = cv2.morphologyEx( src, op, kernel[, anchor[, iterations[, borderType[, borderValue]]]])
  • op 操作类型 | 类型 | 说明 | 含义 | 作用 | 页码 | | —- | —- | —- | —- | —- | | cv2.MORPH_ERODE | 腐蚀 | 腐蚀 |
    |
    | | cv2.MORPH_DILATE | 膨胀 | 膨胀 |
    |
    | | cv2.MORPH_OPEN | 开运算 | 先腐蚀在膨胀 | 用于去噪、计数 | 179 | | cv2.MORPH_CLOSE | 闭运算 | 在膨胀在腐蚀 | 有助与关闭前景物体内部小孔,或去除物体上的小黑点,还可以将不同的前景图像进行衔接 | 180 | | cv2.MORPH_GRADIENT | 形态学梯度运算 | 膨胀图减腐蚀图 | 得到原始图像的边缘 | 182 | | cv2.MORPH_TOPHAT | 礼帽运算 | 原始图像减开运算所得图像 | 能够获得图像的噪声信息,或者得到比原始图像更亮的边缘信息 | 184 | | cv2.MORPH_BLACKHAT | 黑帽运算 | 闭运算所得图像减原视图像 | 获取图像内部的小孔,或前景色中小黑点,或者得到比原始图像边缘更黑暗的边缘部分 | 185 | | cv2.MORPH_HITMISS | 击中击不中 | 前景背景腐蚀运算的交集,仅仅支持CV_8UCI二进制图像 |
    |
    |

4.核函数 cv2.getStructuringElement P186

  1. retval = cv2.getStructuringElement( shape, ksize[, anchor])
  • shape 操作类型 cv2.MORPH_RECT 矩形,所有元素都是1, cv2.MORPH_CROSS,十字形,对角1, cv2.MORPH_ELLIPSE 椭圆形

    9.梯度图像

    1.Sobel算子 cv2.Sobel P191

    1. dst = cv2.Soble( src, ddepth, dx, dy[, ksize[, delta[, borderType]]])
  • ddepth 一般用cv2.CV_64F

  • dx x方向上的求导阶数
  • dy y方向上的求导阶数
  • ksize Sobel核大小,-1就会用Scharr算子

    2.Scharr算子 P200

    1. dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]])
  • scale 缩放因子,默认是1及没有缩放

    3.拉布拉斯算子 cv2.Laplacian P206

    1. dst = cv2.Laplacian( src, ddepth, dx, dy[, ksize[, delta[, borderType]]]))

    10.Canny 边缘检测 P209

    步骤

    1)使用高斯滤波器,以平滑图像,滤除噪声。
    2)计算图像中每个像素点的梯度强度和方向。
    3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
    4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
    5)通过抑制孤立的弱边缘最终完成边缘检测。

opencv 轻松入门学习 api总结 - 图2

11.图像金字塔

1.高斯金字塔向下采样 cv2.pyrDown P217

  1. # 一层下一层,宽高为原来一半
  2. dst = cv2.pyrDown( src[, dstsize[, borderType]])

2.高斯金字塔向上采样 cv2.pyrUp P219

  1. # 一层上一层,宽高为原来2倍
  2. dst = cv2.pyrDown( src[, dstsize[, borderType]])

3.拉普拉斯金字塔 P223

为了恢复高分辨率的图像

  • 表示拉普拉斯金字塔的第i层
  • 表示高斯金字塔的第i层

12.图像轮廓

1.查找轮廓 cv2.findContours P229

  1. image, contours, hierarchy = cv2.findContours( image, mode, method)
  • contours 返回的轮廓,全部轮廓,数组
  • hierarchy 图像拓扑信息(4版本没有了)
  • mode 轮廓检索模式,一般用cv2.RETR_EXTERNAL,只检测外轮廓,更多参数请看P232
  • method 轮廓的近似方法

    2.绘制图像轮廓cv2.drawContours P237

    1. image = cv2.drawContours( image,contours, contourIdx, color[, thickness[, lineType]])
  • contours 所要画的轮廓

  • contourIdx 一般-1,表示全画
  • color 颜色
  • thickness 轮廓粗细大小,-1表示实心
  • lineType 轮廓的样式

    3. 矩的计算 cv2.moments P241

    1. retval = cv2.moments( array[, binaryImage])

    4.计算轮廓面积 cv2.contourArea P243

    1. retval = cv2.contourArea( contour [, oriented])

    5.轮廓长度 cv2.arcLength P246

    1. retval = cv2.arcLength ( contour, closed)
  • closed 是否是封闭的,True 是封闭的

    6.Hu矩函数cv2.HuMoments P248

    1. hu = cv2.HuMoments( m )
  • hu 数组返回7个,一般只用到第一个,hu[0]

  • m 由cv2.moments计算得来的矩阵特征值

    7.形状匹配cv2.matchShapes P252

    1. retval = cv2.matchShapes( contour1, contour2, method, parameter)

    8.轮廓拟合 cv2.boundingRect P254

    1. retval = cv2.boundingRect( array )
  • retval 返回矩形边界的左上角顶点的坐标值及矩形边界的宽度和高度

    9.最小包围矩形框 cv2.minAreaRect P257

    1. retval = cv2.minAreaRect( points )
  • retval 返回的是最小外接矩形的中心(x,y) 宽度高度 旋转角度

  • 注意,这个返回值不能直接用cv2.drawContours去画出来,需要dst = cv2.boxPoints( retval 转化的dst去画

    10.最小包围圆形 cv2.minEnclosingCircle P259

    1. center, radius = cv2.minEnclosingCircle( points )

    11.最优拟合椭圆 cv2.fitEllipse P260

    1. retval = cv2.fitEllipse( points )

    12.最优拟合直线 cv2.fitLine P261

    1. line = cv2.fitLine( points, disType, param, reps, aeps)

    13.最小外包三角形 cv2.minEnclosingTriangle P262

    1. retval, triangle = cv2.minEnclosingTriangle( points )

    14.逼近多边形 cv2.approxPolyDP P263

    1. approxCurve = cv2.approxPolyDP( curve, epsilon, closed)

    15.凸包 cv2.convexHull P266

    1. hull = cv2.convexHull( points[, clockwise[, returmnPoints]])

    16.凸缺陷 cv2.convexityDefects P268

    1. convexityDefects = cv2.convexityDefects( contour, convexhull)

    17.检测是都是凸形 cv2.isContourConvex P270

    1. retval = cv2.isContourConvex( contour )

    18.点到轮廓的距离 cv2.pointPolygonTest P272

    1. retval = cv2.pointPolygonTest( contour, pt, measureDist)

    19.计算场景距离 cv2.createShapeContextDistanceExtractor P275

    20.计算Hausdorff距离 cv2.createHausdorfDistanceExtractor P278

    21.cv2.findNonZero P289

    22.找最大最小以及他们的位置 cv2.minMaxLoc P291

    23.平均颜色及平均灰度 cv2.mean P293

    24.极点 tuple P294

    1. leftmost = typle( cnt[cnt[:, :, 0].argmin()][0])
    2. rightmost = typle( cnt[cnt[:, :, 0].argmax()][0])
    3. topmost = typle( cnt[cnt[:, :, 1].argmin()][0])
    4. bottommost = typle( cnt[cnt[:, :, 1].argmax()][0])
  • cnt 表示轮廓

    13.直方图处理

    直方图信息cv2.calsHist P303

    1. hist = cv2.calsHist(imgaes, channels, mask, histSize, ranges, accumulate
  • hist 返回得统计直方图,是一个一维数组,数组内得元素是各个灰度级得像素个数

  • images [] 要在里面
  • channels 通道编号 [0] [1] [2] 对应 B G R
  • histSize BINS得值,需要用[]括起来,如BINS得值是255,则[255]
  • ranges 像素值得范围 如,8位灰度图得像素值范围是[0,255]

    直方图均衡化 cv.equalizeHsit P317

    1. dst = cv.equalizeHsit( src )

14傅里叶变换

1.实现傅里叶变换 P329

  1. 返回值1 = numpy.fft.fft2( 原始图像 )
  2. 返回值2 = numpy.fft.fftshift( 返回值1 )
  3. # 为了能显示图像还需要转换下
  4. 像素新值 = 20 * np.numpy.log( np.abs( 返回值2 ))
  • 返回值1 是一个复数数组
  • 原始图像 需要处理下变灰度图像

2.逆傅里叶 P330

  1. ifftshift ifft2

3.高通滤波 P331

高频信号对应图像内变换越来越快的灰度值,是由灰度的尖锐过度造成的

4.opencv 实现傅里叶的变换与逆向 P333

  1. 返回结果 = cv2.dft( 原始图像, 转换标识)
  2. 返回结果 = cv2.idft( 原始图像)
  • 原始图像 需要用np.float32()函数转换一下
  • 转换标识 一般是cv2.DFT_COMPLEX_OUTPUT
  1. 返回值 = cv2.magnitude( 参数1 参数2)
  • 参数1 浮点型x坐标值,实部
  • 参数2 浮点型y坐标值,虚部
  • 详细见P334

    5.低通滤波 336

    低频信号对应图像内变缓慢的灰度分量

15.模板匹配

1.模板匹配基础 cv2.matchTemplate P339

  1. result = cv2.matchTemplate( image, templ, method[, mask])
  • image 必须是8位或者32位的浮点型图像
  • templ 模板图像

    2.查找匹配出来的最佳位置 cv2.minMaxLoc P342

    1. minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc( src [, mask])

16.霍夫变换

1.HonghLines函数 找直线 P357

  1. lines = cv2.HonghLines( image, rho, theta, threshold)

2.HonghLinesP改进版霍夫 P360

  1. lines = cv2.HonghLinesP( image, rho, theta, threshold, minLineLength, maxLineGap)

3.霍夫圆环变换 P361

  1. circles = cv2.HonghCircles( image, method, dp, minDsit, param1, param2, minRadius, maxRadius)

17.图像分割与提取 分水岭算法

1.cv2.watershed 分水岭 P374

见P366,P375的实例17.6

2.交互式前景提取 P377

直接看书本例子P381 实例17.9

  1. img = cv2.imread("images/lena.jpg")
  2. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  3. ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
  4. # 噪音去除
  5. kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
  6. opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
  7. sure_bg = cv2.dilate(opening, kernel, iterations=2) # 确定背景区域
  8. sure_fg = cv2.erode(opening, kernel, iterations=2) # 确定前景区域
  9. unknown = cv2.subtract(sure_bg, sure_fg) # 未知区域
  10. # 执行距离变换算法
  11. dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
  12. # 对范围 = {0.0, 1.0} 的距离图像进行归一化
  13. cv2.normalize(dist_transform, dist_transform, 0, 1.0, cv2.NORM_MINMAX)
  14. # 寻找确定的前景区域
  15. ret, sure_fg = cv2.threshold(dist_transform, 0.5*dist_transform.max(), 255, 0)
  16. # 寻找未知区域
  17. sure_fg = np.uint8(sure_fg)
  18. unknown = cv2.subtract(sure_bg,sure_fg)
  19. # 标记标记
  20. ret, markers = cv2.connectedComponents(sure_fg)
  21. print(markers)
  22. # 向所有标签添加 1,确保背景不是 0,而是 1
  23. markers = markers+1
  24. print(">>",markers)
  25. # 现在,用零标记未知区域
  26. markers[unknown==255] = 0
  27. markers_copy = markers.copy()
  28. markers_copy[markers == 0] = 150 # 灰色表示背景
  29. markers_copy[markers==1] = 0 # 黑色表示背景
  30. markers_copy[markers>1] = 255 # 白色表示前景
  31. markers_copy = np.uint8(markers_copy)
  32. # 使用分水岭算法执行基于标记的图像分割,将图像中的对象与背景分离
  33. markers = cv2.watershed(img, markers)
  34. img[markers==-1] = [0,0,255] # 将边界标记为红色

18.视频处理

1.VideoCapture类 P383-P392

  1. 俘获对象 = cv2.VideoCapture( "摄像头ID/文件" )

19.绘图及交互

通用参数 P393

  • img 载图图像
  • color 绘图形状颜色。通常使用BGR模型代表颜色,如(0,0,255)
  • thickness 线条粗细 默认1,要是-1就是填充凸形
  • lineType 线条类型

1.绘制直线 cv2.line P394

  1. img = cv2.line( img, pt1, pt2, color[, thickness[, lingType]])
  • pt1 线段起点
  • pt2 线段中点

    2.绘制矩形 cv2.rectangle P394

    1. img = cv2.rectangle( img, pt1, pt2, color[, thickness[, lingType]])
  • pt1 矩形顶点

  • pt2 矩形中与pt1对角的顶点

3.绘制圆形 cv2.circle P395

  1. img = cv2.circle( img, center, radius, color[, thickness[, lingType]])
  • center 圆心
  • radius 半径

    4.绘制椭圆 cv2.ellipse P397

    1. img = cv2.ellipse( img, center, axes, angle, startAngle,endAngle, color[, thickness[, lingType]])
  • center 椭圆的圆心

  • axes 轴的长度
  • angle 偏转角度
  • startAngle 圆弧起始角的角度
  • endAngle 圆弧终结角的角度

    5.绘制多边形 cv2.polylines P398

    1. img = cv2.polylines( img, pts, isClosed, color[, thickness[, lingType[, shift]]])
  • pts 多边形的各个顶点

  • isClosed 闭合标记,是否是封闭的 true就是闭合收尾连接

    6.绘制文字 cv2.putText P400

    1. img = cv2.putText( img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
  • text 绘制的字体

  • org 绘制字体的位置,以文字的左下角为起点
  • fontFace 字体类型
  • fontScale 字体大小
  • bottomLeftOrigin 控制文字的方向。要是True 就是垂直输入

    7.鼠标交互 cv2.setMonuseCallback P402

    8.滚动条 cv2.createTrackbar P407

20.K邻近算法

21.支持向量机

22.K均值聚类

23.人脸识别