Python|OpenCV简单应用(三、边缘检测及轮廓检测)

1.Canny边缘检测
canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
必要参数:
第一个参数image是需要处理的原图像,该图像须为单通道的灰度图;
第二个参数threshold1是阈值1;
第三个参数threshold1是阈值2;
其中较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的阈值1用于将这些间断的边缘连接起来;
可选参数中apertureSize就是Sobel算子的大小;
L2gradient参数是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加);
函数返回值为一张二值图像(黑白图像),包含检测出的边缘。
2.阈值函数
threshold(src, thresh, maxval, type)
第一个参数src是需要处理的原图像(数组),该图像须为单通道的灰度图;
第二个参数thresh是阈值;
第三个参数maxval是拟设定的最大值;
第四个参数type为取阈值方法:
THRESH_BINARY:二值阈值化0
THRESH_TOZERO_INV:反二值阈值化1
THRESH_TRUNC:截断阈值化2
THRESH_TOZERO:低于阈值被置为03
THRESH_TOZERO_INV:超过阈值被置为04
函数有两个返回值,第一个返回值ret是指定的thresh,第二个返回值是阈值化后输出结果,例如threshold(img, 127, 255, 0),就是将图像img进行二值阈值化处理,灰度值小于thresh即127设为0,大于127设为maxval即255。
3.轮廓检测函数
findContours(imgt, mode, method)
第一个参数imgt是需要处理的原图像(数组),该图像须为二值图像;
第二个参数mode是轮廓检测模式:
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近似算法
该函数有两个返回值,第一个是轮廓本身contours ,还有一个是每条轮廓对应的属性hierarchy(层级关系)。
4.轮廓绘制函数
【Python|OpenCV简单应用(三、边缘检测及轮廓检测)】drawContours(image, contours,contouridx,scalar&color,thickness)
第一个参数image是需要处理的原图像(数组),输出结果直接更新原图像image;
第二个参数contours为轮廓本身;
第三个参数contouridx指定绘制轮廓中的哪条轮廓,如果是-1,则绘制其中的所有轮廓;
第四个参数为轮廓线颜色(B,G,R);
第五个参数thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。
5.以下代码为分屏实时显示:原始图、灰度图、canny边缘检测图、轮廓检测图。在一个窗口显示时需要图像需为三通道,故利用COLOR_BGR2GRAY将灰度图变为BGR彩色图。

import cv2 import numpy as np #打开摄像头(只有一个摄像头则编号为0,若有2个则依次为0,1) camera = cv2.VideoCapture(0) #创建窗口 cv2.namedWindow('Webcam', cv2.WINDOW_NORMAL) #持续间隔1ms等待按键,若有按键跳出循环 while (cv2.waitKey(1)==-1): #读取摄像头数据并处理,注意需要深拷贝(deep copy) success, frame =camera.read() original=frame.copy()#原始图 gray=cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)#转成灰度图 canny=cv2.Canny(gray, 200, 300) #Canny边缘检测 ret, imgt= cv2.threshold(gray, 127, 255, 0) #阈值处理 contours, hierarchy = cv2.findContours(imgt, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #轮廓检测 cont = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) #将gray转成彩色图像cont cv2.drawContours(cont, contours, -1, (0,0,255))#绘制轮廓 #分屏显示 h1 = np.hstack((original, cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)))#第一行 h2 = np.hstack((cv2.cvtColor(canny,cv2.COLOR_GRAY2BGR), cont))#第二行 vdisp = np.vstack((h1, h2))#纵行 cv2.imshow('Webcam',vdisp) #断开摄像头 camera.release() #释放所有窗口 cv2.destroyAllWindows()


    推荐阅读