一,安装opencv
版本说明:
这里使用的python版本是3.8.3,opencv版本4.4.0,opencv-contrib-python版本是4.5.1.48(都是高版本,所以会踩坑,虽然LZ会踩坑,但总会把问题解决掉的)
pip命令直接安装
检验方法(这里的版本是4.4.0)
还需要安装配套使用的opencv-contrib-python(最好版本一致)
二,操作图像的基础操作
1,图像读取
cv2.IMREAD_COLOR:彩色图像
cv2.IMREAD_GRAYSCALE:灰度图像
然后会弹出图像的框展示图像
查看图像的类型
(1422, 800, 3)
宽像素,高像素,3个通道
2,数据读取-视频
cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1.
如果是视频文件,直接指定好路径即可
3,截取部分图像数据
4,颜色通道提取
可以从一张图中分别得到三个通道的值
对三个通道的值分别处理之后还可以将三个通道的值汇总到同一张图中
5,图像融合
图像融合就是把两个图像合成为同一个图像,但是前提是形状得相同,比如,都必须是(400,500,3)这种的,如果不相同则需要提前resize转换为相同的。
融合的效果如下

融合方法的解释:
newImg = cv2.addWeighted(tz_img,0.5,jm_img,0.6,0)
0.5是第一个图像的权重,0.6是第二个图像的权重,最后的0是偏移量,权重可以理解为,数字越大,图像越明显。
还有一个改变图像shape值的方法,就是按照比例放大缩小
二,阈值与平滑处理
1,阈值
- src:输入图,只能输入单通道图像,也就是灰度图
- dst:输出图
- thresh:阈值
- maxval:当像素值超过了阈值(或者小于阈值,根据type来定),所赋予的值
- type:二值化操作的类型,包含以下5种类型
- cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
- cv2.THRESH_BINARY_INV THRESH_BINARY的反转
- cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
- cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
- cv2.THRESH_TOZERO_INV cv2.THRESH_TOZERO的反转
上面的五种二值化操作类型执行结果分别如下(按照顺序)

2,图像平滑
均值滤波
方框滤波
高斯滤波
中值滤波
三,图像形态学处理
1,形态学-腐蚀操作
下面的示例可以看出腐蚀操作到底是干嘛的!

原图是有多余的线条存在的,这样腐蚀和膨胀的操作可以去掉线条!
2,形态学-膨胀操作
上面的图腐蚀之后变细了,现在再进行膨胀操作
3,开运算和闭运算
开运算其实就是上面的操作,只是合到一块了,开运算就是先腐蚀后膨胀,而闭运算则是先膨胀后腐蚀。
4,梯度运算
梯度运算的作用:可以得到一个图型的轮廓
result3 = cv2.morphologyEx(dg,cv2.MORPH_GRADIENT,kenel)
MORPH_GRADIENT为梯度运算
5,礼帽与黑帽
- 礼帽 = 原始输入 - 开运算结果
- 黑帽 = 闭运算 - 原始输入
result3 = cv2.morphologyEx(dg,cv2.MORPH_TOPHAT,kenel)
MORPH_TOPHAT为礼貌操作
MORPH_BLACKHAT为黑帽操作
四,图像梯度处理
利用X方向与Y方向分别实现一阶微分,求取振幅,实现图像梯度效果。
简单来说,就是来得到图像的轮廓。
具体作用和效果参考: https://www.jianshu.com/p/0bff5bc12d64

1,图像梯度-Sobel算子
dst = cv2.Sobel(src,ddepth,dx,dy,ksize)
- ddepth:图像的深度,通常为 -1
- dx和dy分别表示水平和竖直方向
- ksize是Sobel算子的大小
由于上面存在负数的情况,这里把负数取绝对值
求出x的值和y的值后,要把x和y进行相加
五,Canny边缘检测
- 使用高斯滤波器,以平滑图像,滤除噪声
- 计算图像中每个像素点的梯度强度和方向
- 应用非极大值抑制,以消除边缘检测带来的杂散响应
- 应用双阈值检测来确定真实的和潜在的边缘
- 通过抑制孤立的弱边缘最终完成边缘检测
(下限越小,上限越大,条件越宽松,边缘内容越丰富)
下图明显的说明了区别(左图范围比较小,右图范围比较大)

六,图像金字塔与轮廓检测
1,图像金字塔
其实就是将图像以相同的比例放大或缩小n倍。
2,图像轮廓
- mode:轮廓检索模式
- RETR_EXTERNAL:只检索最外面的轮廓
- RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中
- RETR_CCOMP:检索所有的轮廓,并将他们组织为两层,顶层是各部分的外部边界,第二层是空洞的边界
- RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次
- method:轮廓逼近方法
- CHAIN_APPROX_NONE:以freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)
- CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分
为了更好的准确率,使用二值图像进行绘画轮廓!

3,模板匹配
模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别计算程度的方法在opencv里有6种,然后将每次计算的j结果放入一个矩阵里,作为结果输出。
- TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
- TM_CCORR:计算相关性,计算出来的值越大,越相关
- TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
- TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近于0,越相关
- TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近于1,越相关
- TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近于1,越相关
上面可以拿到匹配到的位置坐标(匹配方框的左上角),再加上模板的宽高,那么就可以把匹配到的模板位置画出来(人脸识别框)
功能:画出矩行框
参数:img:原图
(x,y):矩阵的左上点坐标
(x+w,y+h):矩阵的右下点坐标
(0,255,0):画线对应的rgb颜色
2:所画的线的宽度
七,项目实战-信用卡数字识别
思路:
先准备一个模板图,用左边的模板图的1到9与信用卡图像的数字进行模板匹配!
前提:模板图的数字的长相一定要和信用卡图像的数字要非常像才行,否则匹配不准确。
- 第一步,对模板的数字进行轮廓检测,得到数字的外轮廓
- 第二步,得到模板数字的外阶矩形,然后通过resize和信用卡每个数字的外阶矩形的大小保持一致(然后才可以模板匹配)
- 1.处理模板,进行轮廓检测(检测外轮廓)
- 2.得到当前轮廓的外接矩形,并将模板中的外接矩形切割出来,得到0-9对应的模板图片,并resize
- 3.使用形态学操作对信用卡图片进行处理,得到轮廓
- 4.根据矩形轮廓的长宽比挑选出信用卡的数字矩形框,并resize
- 5.使用for循环依次检测

1,ocr_template_match.py
2,my_test.py
3,识别效果
(10,)
(189, 300)
Credit Card Type: Visa
Credit Card #: 4000123456789010Process finished with exit code 0
八,项目实战-文档扫描OCR识别
思路:
- 边缘检测
- 获得轮廓
- 透视变换
这里只是上面三个操作,至于OCR识别就没有搞,交给你们了,可以参考
九,图像特征-harris角点检测
- img:数据类型为float32的入图像
- blockSize:角点检测中指定区域的大小
- ksize:Sobel求导中使用的窗口大小
- k:取值参数为[0.04,0.06]
效果:会把角点检测出来,用红线画出。
十,图像特征-sift
1,图像尺度空间
在一定的范围内,无论物体是大还是小,人眼都可以分辨出来,然而计算机要有相同的能力却很难,所以要让机器能够对物体在不同尺度下有一个统一的认知,就需要考虑图像在不同的尺度下都存在的特点。
尺度空间的获取通常使用高斯模糊来实现!
2,opencv-sift函数
由于这个函数高版本已经没有了,所以这里暂且不说!
十一,背景建模
1,帧差法
由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同,该类算法对时间上连续的两帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。
效果

十二,光流估计
光流是空间运动物体在观测成像平面上的像素运动的“瞬时速度”,根据各个像素点的速度矢量特征,可以对图像进行动态分析,例如目标跟踪。
参数:
- prevImage:前一帧图像
- nextImage:当前帧图像
- prevPts:待跟踪的特征点向量
- winSize:搜索窗口的大小
- maxLevel:最大的金字塔层数
返回:
- nextPts:输出跟踪特征点向量
- status:特征点是否找到,找到状态为1,否则为0
python的opencv学习暂时到此结束!
作者:樊同学
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

所有评论(0)