- 1.入门基本api
- 2.图像处理
- 3.图像运算
- 4.色彩空间
- 5.几何变换
- 6.阈值处理
- 7.图像平滑处理
- 8.形态学操作
- 9.梯度图像
- 10.Canny 边缘检测 P209
- 11.图像金字塔
- 12.图像轮廓
- 1.查找轮廓 cv2.findContours P229
- 2.绘制图像轮廓cv2.drawContours P237
- 3. 矩的计算 cv2.moments P241
- 4.计算轮廓面积 cv2.contourArea P243
- 5.轮廓长度 cv2.arcLength P246
- 6.Hu矩函数cv2.HuMoments P248
- 7.形状匹配cv2.matchShapes P252
- 8.轮廓拟合 cv2.boundingRect P254
- 9.最小包围矩形框 cv2.minAreaRect P257
- 10.最小包围圆形 cv2.minEnclosingCircle P259
- 11.最优拟合椭圆 cv2.fitEllipse P260
- 12.最优拟合直线 cv2.fitLine P261
- 13.最小外包三角形 cv2.minEnclosingTriangle P262
- 14.逼近多边形 cv2.approxPolyDP P263
- 15.凸包 cv2.convexHull P266
- 16.凸缺陷 cv2.convexityDefects P268
- 17.检测是都是凸形 cv2.isContourConvex P270
- 18.点到轮廓的距离 cv2.pointPolygonTest P272
- 19.计算场景距离 cv2.createShapeContextDistanceExtractor P275
- 20.计算Hausdorff距离 cv2.createHausdorfDistanceExtractor P278
- 21.cv2.findNonZero P289
- 22.找最大最小以及他们的位置 cv2.minMaxLoc P291
- 23.平均颜色及平均灰度 cv2.mean P293
- 24.极点 tuple P294
- 13.直方图处理
- 14傅里叶变换
- 15.模板匹配
- 16.霍夫变换
- 17.图像分割与提取 分水岭算法
- 18.视频处理
- 19.绘图及交互
- 20.K邻近算法
- 21.支持向量机
- 22.K均值聚类
- 23.人脸识别
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,公式
cv2.add
两个加起来,超过255,那就是取255
cv2.addWeighted >>书P40
dst = cv2.addweighted(src1, alpha, src2, beta, gamma)
逻辑运算 与或非 >>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,可以用0表示,二值化处理 其他见书
- 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)
-
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 是卷积核,是一个单通道的数组。要是想在彩色通道使用,就得拆分通道一个一个处理
-
8.形态学操作
1.腐蚀cv2.erode P170
dst = cv2.erode( srrc, kernel[, anchor[, iterations[, borderType[, borderValue]]]])
-
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方向上的求导阶数
-
2.Scharr算子 P200
dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]])
-
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)通过抑制孤立的弱边缘最终完成边缘检测。
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
-
2.绘制图像轮廓cv2.drawContours P237
image = cv2.drawContours( image,contours, contourIdx, color[, thickness[, lineType]])
contours 所要画的轮廓
- contourIdx 一般-1,表示全画
- color 颜色
- thickness 轮廓粗细大小,-1表示实心
-
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)
-
6.Hu矩函数cv2.HuMoments P248
hu = cv2.HuMoments( m )
hu 数组返回7个,一般只用到第一个,hu[0]
-
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])
-
13.直方图处理
直方图信息cv2.calsHist P303
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
dst = cv.equalizeHsit( src )
14傅里叶变换
1.实现傅里叶变换 P329
返回值1 = numpy.fft.fft2( 原始图像 )
返回值2 = numpy.fft.fftshift( 返回值1 )
# 为了能显示图像还需要转换下
像素新值 = 20 * np.numpy.log( np.abs( 返回值2 ))
- 返回值1 是一个复数数组
- 原始图像 需要处理下变灰度图像
2.逆傅里叶 P330
ifftshift ifft2
3.高通滤波 P331
高频信号对应图像内变换越来越快的灰度值,是由灰度的尖锐过度造成的
4.opencv 实现傅里叶的变换与逆向 P333
返回结果 = cv2.dft( 原始图像, 转换标识)
返回结果 = cv2.idft( 原始图像)
- 原始图像 需要用np.float32()函数转换一下
- 转换标识 一般是cv2.DFT_COMPLEX_OUTPUT
返回值 = cv2.magnitude( 参数1, 参数2)
15.模板匹配
1.模板匹配基础 cv2.matchTemplate P339
result = cv2.matchTemplate( image, templ, method[, mask])
- image 必须是8位或者32位的浮点型图像
- templ 模板图像
2.查找匹配出来的最佳位置 cv2.minMaxLoc P342
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc( src [, mask])
16.霍夫变换
1.HonghLines函数 找直线 P357
lines = cv2.HonghLines( image, rho, theta, threshold)
2.HonghLinesP改进版霍夫 P360
lines = cv2.HonghLinesP( image, rho, theta, threshold, minLineLength, maxLineGap)
3.霍夫圆环变换 P361
circles = cv2.HonghCircles( image, method, dp, minDsit, param1, param2, minRadius, maxRadius)
17.图像分割与提取 分水岭算法
1.cv2.watershed 分水岭 P374
2.交互式前景提取 P377
直接看书本例子P381 实例17.9
img = cv2.imread("images/lena.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# 噪音去除
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
sure_bg = cv2.dilate(opening, kernel, iterations=2) # 确定背景区域
sure_fg = cv2.erode(opening, kernel, iterations=2) # 确定前景区域
unknown = cv2.subtract(sure_bg, sure_fg) # 未知区域
# 执行距离变换算法
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
# 对范围 = {0.0, 1.0} 的距离图像进行归一化
cv2.normalize(dist_transform, dist_transform, 0, 1.0, cv2.NORM_MINMAX)
# 寻找确定的前景区域
ret, sure_fg = cv2.threshold(dist_transform, 0.5*dist_transform.max(), 255, 0)
# 寻找未知区域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
# 标记标记
ret, markers = cv2.connectedComponents(sure_fg)
print(markers)
# 向所有标签添加 1,确保背景不是 0,而是 1
markers = markers+1
print(">>",markers)
# 现在,用零标记未知区域
markers[unknown==255] = 0
markers_copy = markers.copy()
markers_copy[markers == 0] = 150 # 灰色表示背景
markers_copy[markers==1] = 0 # 黑色表示背景
markers_copy[markers>1] = 255 # 白色表示前景
markers_copy = np.uint8(markers_copy)
# 使用分水岭算法执行基于标记的图像分割,将图像中的对象与背景分离
markers = cv2.watershed(img, markers)
img[markers==-1] = [0,0,255] # 将边界标记为红色
18.视频处理
1.VideoCapture类 P383-P392
俘获对象 = cv2.VideoCapture( "摄像头ID/文件" )
19.绘图及交互
通用参数 P393
- img 载图图像
- color 绘图形状颜色。通常使用BGR模型代表颜色,如(0,0,255)
- thickness 线条粗细 默认1,要是-1就是填充凸形
- lineType 线条类型
1.绘制直线 cv2.line P394
img = cv2.line( img, pt1, pt2, color[, thickness[, lingType]])
- pt1 线段起点
-
2.绘制矩形 cv2.rectangle P394
img = cv2.rectangle( img, pt1, pt2, color[, thickness[, lingType]])
pt1 矩形顶点
- pt2 矩形中与pt1对角的顶点
3.绘制圆形 cv2.circle P395
img = cv2.circle( img, center, radius, color[, thickness[, lingType]])
- center 圆心
-
4.绘制椭圆 cv2.ellipse P397
img = cv2.ellipse( img, center, axes, angle, startAngle,endAngle, color[, thickness[, lingType]])
center 椭圆的圆心
- axes 轴的长度
- angle 偏转角度
- startAngle 圆弧起始角的角度
-
5.绘制多边形 cv2.polylines P398
img = cv2.polylines( img, pts, isClosed, color[, thickness[, lingType[, shift]]])
pts 多边形的各个顶点
isClosed 闭合标记,是否是封闭的 true就是闭合收尾连接
6.绘制文字 cv2.putText P400
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