本文根据opencv 轻松入门 面向python总结的,便于查找,每个函数都对应书里页码,可以看我语雀排版好的
https://www.yuque.com/nuanyanggaozhao/glvn9z/smagn3
1.入门基本api
1.图像读取 imread
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
None = cv2.imshow( 窗口名称,图像)
key = cv2.waitkey(0) #这个0,是表示一直停在界面无限等待
其中waitkey里的参数,不写就是键盘按什么返回什么
key == ord(’ A ') 可以用ord将键盘转换为ASCII码去跟返回的值比较
3.保存图像
retval = cv2.imwrite( filename, img[, params])
- retval 是返回值,保存成功True,反之False
- filename 表示要保存的图像的完整文件名.拓展名
- img 是被保存图像的名称
- params 保存类型参数,可选
2.图像处理
略
3.图像运算
加号运算
使用“+”运算,图像a,图像b,公式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MsVEJMJK-1624751668875)(https://cdn.nlark.com/yuque/__latex/54c90174a75a910f64fbc38a15a1c01a.svg#card=math&code=a%20%2B%20b%20%3D%0A%5Cbegin%7Bcases%7D%0Aa%20%2B%20b%2C%20%20%26%20%5Ctext%7Ba%20%2B%20b%20%E2%89%A4%20255%7D%20%5C%5C%5B2ex%5D%0Amod%EF%BC%88a%20%2B%20b%2C%20256%EF%BC%89%2C%20%26%20%5Ctext%7Ba%20%0A%20%2B%20b%20%3E%20255%7D%0A%5Cend%7Bcases%7D&id=r7Bhg)]
cv2.add
两个加起来,超过255,那就是取255
cv2.addWeighted >>书P40
dst = cv2.addweighted(src1, alpha, src2, beta, gamma)
图1,图1权重,图2,图2权重,混合图片亮度
逻辑运算 与或非 >>P43
cv2.bitwise_and() # 与
cv2.bitwise_or() #或
cv2.bitwise_xor() #按位异或
cv2.bitwise_not #按位取反
4.色彩空间
1.cvtColor >>P83
cv2.cvtColor( src, code [, dstCn])
2.inRange >>P97
dst = cv2.inRange( src, lowerb, upperb)
5.几何变换
1.缩放 cv2.resize P106
dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]])
- dsize 代表输出图像大小
- fx 代表水平方向的缩放比例
- fy 代表垂直方向的缩放比例
- interpolation 代表插值方式 见书
2.翻转 cv2.flip P110
# filpCode 翻转类型,x轴 0,/ y轴 正数 / xy同时,负数
dst = cv2.flip( src, filpCode)
3.仿射 cv2.warpAffine P111
dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]])
- M 代表一个2x3的变换矩阵。不同的矩阵不同的效果
旋转 P113
可以用cv2.getRotationMatrix2D( center, angle, scale)去生成M
负责的仿射 P114
# M生成
retval = cv2.getAffineTransform( sec, dst)
4.透视 cv2.warpPerspective P115
dst = cv2.warpPerspective( src, M, dsize[, flags[, borderMode[, borderValue]]])
5.重映射 cv2.remap P117
dst = cv2.remap( src, map1, map2, interpolation[, borderMode[, borderValue]])
此函数功能可以复制P119,翻转P121,xy轴互换P126
6.阈值处理
1.cv2.threshold P130
retval, dst = cv2.threshold( src, thresh, maxval, type)
- retval 代表返回的阈值
- thresh,maxval 两个阈值
- type 常用参数,cv2.THRESH_RINARY,二值化处理 其他见书
- type 要是 cv2.THRESH_RINARY + cv2.THRESH_OTSU,就是会自动计算最优阈值,并且返回计算的阈值大小,P141有介绍
2.自适应阈值 cv2.adaptiveThreshold P139
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
dst = cv2.blur( src, ksize, anchor, borderType)
- ksize 是滤波核的大小。滤波核大小指在均值处理过程中,其领域图像的高度和宽度。其指可以是(5,5)
- anchor 是锚点,默认值是(-1,-1),表示当前计算均值的点位于核的中间点位置
2.方框滤波 cv2.boxFilter P152
dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType)
- ddepth 处理图像的深度,一般-1,表示与原始图像使用相同的图像深度
- ksize 是滤波核大小
- normalize 表示在滤波时是否进行归一化,1表示进行归一化,要用领域像素值的和除以面积,0不用,但可能因为加起来的值大于255,数值截断,画面变成白色的了
3.高斯滤波 cv2.GaussianBlur P158
dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType)
- sigmaX 是卷积核在水平方向上(x轴方向)的标准差,其控制的是权重比例(参数必须要)
- sigmaY 是卷积核在垂直方向上(Y轴方向)的标准差,如果为0,则只才用sigmaX
4.中值滤波 cv2.medianBlur P161
# 去噪效果很好
dst = cv2.medianBlur( src, ksize)
- ksize 滤波核大小,必须是单数且大于1,如3,5,7
5.双边滤波 cv2.bilateralFilter P164
dst = cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace, borderType)
- d 是滤波时选取的空间距离参数,表示以当前像素点为中心点的直径,推荐用d=5,较大噪声可以用9
6.2D卷积 cv2.filter2D P166
dst = cv2.filter2D( src, ddepth, kernel, anchor, delta, borderType)
- kernel 是卷积核,是一个单通道的数组。要是想在彩色通道使用,就得拆分通道一个一个处理
- dalta 修正值
8.形态学操作
1.腐蚀cv2.erode P170
dst = cv2.erode( srrc, kernel[, anchor[, iterations[, borderType[, borderValue]]]])
- iterations 腐蚀操作迭代次数,默认1
2.膨胀 cv2.dilate P176
dst = cv2.dilate( src, kernel[, anchor[, iterations[, borderType[, borderValue]]]])
3.通用形态学函数 cv2.morphologyEx P178
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
retval = cv2.getStructuringElement( shape, ksize[, anchor])
- shape 操作类型 cv2.MORPH_RECT 矩形,所有元素都是1, cv2.MORPH_CROSS,十字形,对角1, cv2.MORPH_ELLIPSE 椭圆形
9.梯度图像
1.Sobel算子 cv2.Sobel P191
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
dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]])
- scale 缩放因子,默认是1及没有缩放
3.拉布拉斯算子 cv2.Laplacian P206
dst = cv2.Laplacian( src, ddepth, dx, dy[, ksize[, delta[, borderType]]]))
10.Canny 边缘检测 P209
步骤
1)使用高斯滤波器,以平滑图像,滤除噪声。
2)计算图像中每个像素点的梯度强度和方向。
3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5)通过抑制孤立的弱边缘最终完成边缘检测。
![](https://img-blog.csdnimg.cn/img_convert/106983926a2ce17c4982275b26df3dbc.png#from=url&id=wQ3SI&margin=[object Object]&originHeight=238&originWidth=752&originalType=binary&ratio=1&status=done&style=none)
11.图像金字塔
1.高斯金字塔向下采样 cv2.pyrDown P217
# 一层下一层,宽高为原来一半
dst = cv2.pyrDown( src[, dstsize[, borderType]])
2.高斯金字塔向上采样 cv2.pyrUp P219
# 一层上一层,宽高为原来2倍
dst = cv2.pyrDown( src[, dstsize[, borderType]])
3.拉普拉斯金字塔 P223
为了恢复高分辨率的图像
- 表示拉普拉斯金字塔的第i层
- 表示高斯金字塔的第i层
12.图像轮廓
1.查找轮廓 cv2.findContours P229
image, contours, hierarchy = cv2.findContours( image, mode, method)
- contours 返回的轮廓,全部轮廓,数组
- hierarchy 图像拓扑信息(4版本没有了)
- mode 轮廓检索模式,一般用cv2.RETR_EXTERNAL,只检测外轮廓,更多参数请看P232
- method 轮廓的近似方法
2.绘制图像轮廓cv2.drawContours P237
image = cv2.drawContours( image,contours, contourIdx, color[, thickness[, lineType]])
- contours 所要画的轮廓
- contourIdx 一般-1,表示全画
- color 颜色
- thickness 轮廓粗细大小,-1表示实心
- lineType 轮廓的样式
3. 矩的计算 cv2.moments P241
retval = cv2.moments( array[, binaryImage])
4.计算轮廓面积 cv2.contourArea P243
retval = cv2.contourArea( contour [, oriented])
5.轮廓长度 cv2.arcLength P246
retval = cv2.arcLength ( contour, closed)
- closed 是否是封闭的,True 是封闭的
6.Hu矩函数cv2.HuMoments P248
hu = cv2.HuMoments( m )
- hu 数组返回7个,一般只用到第一个,hu[0]
- m 由cv2.moments计算得来的矩阵特征值
7.形状匹配cv2.matchShapes P252
retval = cv2.matchShapes( contour1, contour2, method, parameter)
8.轮廓拟合 cv2.boundingRect P254
retval = cv2.boundingRect( array )
- retval 返回矩形边界的左上角顶点的坐标值及矩形边界的宽度和高度
9.最小包围矩形框 cv2.minAreaRect P257
retval = cv2.minAreaRect( points )
- retval 返回的是最小外接矩形的中心(x,y) 宽度高度 旋转角度
- 注意,这个返回值不能直接用cv2.drawContours去画出来,需要dst = cv2.boxPoints( retval 转化的dst去画
10.最小包围圆形 cv2.minEnclosingCircle P259
center, radius = cv2.minEnclosingCircle( points )
11.最优拟合椭圆 cv2.fitEllipse P260
retval = cv2.fitEllipse( points )
12.最优拟合直线 cv2.fitLine P261
line = cv2.fitLine( points, disType, param, reps, aeps)
13.最小外包三角形 cv2.minEnclosingTriangle P262
retval, triangle = cv2.minEnclosingTriangle( points )
14.逼近多边形 cv2.approxPolyDP P263
approxCurve = cv2.approxPolyDP( curve, epsilon, closed)
15.凸包 cv2.convexHull P266
hull = cv2.convexHull( points[, clockwise[, returmnPoints]])
16.凸缺陷 cv2.convexityDefects P268
convexityDefects = cv2.convexityDefects( contour, convexhull)
17.检测是都是凸形 cv2.isContourConvex P270
retval = cv2.isContourConvex( contour )
18.点到轮廓的距离 cv2.pointPolygonTest P272
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
leftmost = typle( cnt[cnt[:, :, 0].argmin()][0])
rightmost = typle( cnt[cnt[:, :, 0].argmax()][0])
topmost = typle( cnt[cnt[:, :, 1].argmin()][0])
bottommost = typle( cnt[cnt[:, :, 1].argmax()][0])
- cnt 表示轮廓
13.直方图处理