图像轮廓
轮廓可以说是一个很好的图像目标的外部特征,这种特征对于我们进行图像分析,目标识别和理解等更深层次的处理都有很重要的意义
换句话说,边缘检测能够测出边缘,但是边缘是不连续的。将边缘连接为一个整体,构成轮廓
需要注意的问题
1> 通常是针对二值图像的轮廓提取,需要预先进行阈值分割或者边缘检测处理
2> 查找轮廓需要更改原始图像,因此,通常使用原始图像的一份拷贝操作
3> 在opencv中,寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景必须是黑色
cv2.findContours()查找图像轮廓函数
contours,hierarchy = cv2.findContours(image,mode,method)
1> contours:轮廓;hierarchy:图像的拓扑信息(轮廓层次)
2> image:原始图像;mode:轮廓检索模式;method:轮廓的近似方法
cv2.drawContours()将查找到图像轮廓绘制到图像上
r = cv2.drawContours(o,contours,contourldx,color[,thickness])
1> r:目标图像,直接修改目标的像素点,实现绘制
2> o:原始图像;contours:需要绘制的边缘数组;contourldx:需要绘制的边缘索引(如果全部绘制则为-1);color:绘制的颜色;thickness:绘制轮廓时所用的画笔粗细(可选)
import cv2 img = cv2.imread(r"image\contours.bmp",cv2.IMREAD_COLOR) # 彩色图像转灰度图 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 灰度图转换为二值图,cv2.THRESH_BINARY(二进制阈值化) ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # cv2.findContours()查找图像轮廓函数 contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) # 拷贝原始图像,因为查找轮廓需要更改原始图像 copy_img = img.copy() copy_img2 = img.copy() # cv2.drawContours()将查找到图像轮廓绘制到图像上 # 绘制第一个图像的轮廓 result1 = cv2.drawContours(copy_img,contours,0,(0,255,0),6) # 绘制所有图像的轮廓 result2 = cv2.drawContours(copy_img2,contours,-1,(0,255,0),6) cv2.imshow("original",img) cv2.imshow("result1",result1) cv2.imshow("result2",result2) cv2.waitKey(0) cv2.destroyAllWindows()
提取图像的轮廓,实验结果: