Opencv学习笔记(一)---阈值处理和轮廓检测

本系列会完成一些任务,顺便讲解里面的一部分相关代码,本系列为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],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

猜你喜欢

转载自blog.csdn.net/qq_35307005/article/details/88781083