本系列会完成一些任务,顺便讲解里面的一部分相关代码,本系列为opencv的学习笔记,实践篇将应用学习笔记完成一系列OCR任务
opencv博客汇:
1.阈值处理和轮廓检测
1.0 阈值轮廓的实践
阈值处理
1.固定阈值
作用:选取一个全局阈值,然后就把整幅图像分成了非黑即白的二值图像了.
函数为cv2.threshold()
‘ret, dst = cv2.threshold(src, thresh, maxval, type)’
这个函数有四个参数,
- src: 输入图,只能输入单通道图像,通常来说为灰度图
- dst: 输出图
- thresh: 阈值
- maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定,默认为超过),所赋予的值
- type:二值化操作的类型
常用类型有:
• cv2.THRESH_BINARY(黑白二值)
• cv2.THRESH_BINARY_INV(黑白二值反转)
• cv2.THRESH_TRUNC (得到的图像为多像素值)
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV
该函数有两个返回值,第一个retVal(得到的阈值值),第二个就是阈值化后的图像。
2.自适应阈值
前面看到简单阈值是一种全局性的阈值,只需要规定一个阈值值,
整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,
通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其
他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。
‘dst = cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)’
- src: 输入图,只能输入单通道图像,通常来说为灰度图
- dst: 输出图
- maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
- thresh_type: 阈值的计算方法,包含以下2种类型:
cv2.ADAPTIVE_THRESH_MEAN_C; 领域内均值
cv2.ADAPTIVE_THRESH_GAUSSIAN_C. 领域内像素点加权和,权重为一个高斯窗口 - type:二值化操作的类型,与固定阈值函数相同,包含以下5种类型:
cv2.THRESH_BINARY;
cv2.THRESH_BINARY_INV;
cv2.THRESH_TRUNC;
cv2.THRESH_TOZERO;
cv2.THRESH_TOZERO_INV. - Block Size: 图片中选择区域大小
- C :阈值计算方法中的常数项 阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)
3.Otsu 滤波
在cv2.threshold的方法参数中加上语句cv2.THRESH_OTSU,可以自动寻找比较适合的阈值
‘ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)’
轮廓检测
1.cv2.findContours()
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
- 第一个参数是寻找轮廓的图像;
- 第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。 如果内孔内还有一个连通物体,这个物体的边界也在顶层
cv2.RETR_TREE建立一个等级树结构的轮廓。 - 第三个参数method为轮廓的近似办法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
返回值有两个:
contour返回值:
cv2.findContours()函数首先返回一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。
hierarchy返回值:
此外,该函数还可返回一个可选的hiararchy结果,这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。