Opencv中有两个主要用于轮廓发现的API:findContours发现轮廓,drawContours绘制轮廓。
轮廓发现的原理:是基于图像的边缘提取的基础上,寻找对象的轮廓的方法。因此边缘提取的阈值大小会影响到轮廓最终的结果好坏。
#17,轮廓发现
import cv2 as cv
import numpy as np
def image_Contours(image):
#防止随机噪声影响效果,首先对原图高斯滤波
dst=cv.GaussianBlur(image,(3,3),0)
#将原图像转换为灰度图像
gray=cv.cvtColor(dst,cv.COLOR_BGR2GRAY)
#图像利用阈值化进行二值化
ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
cv.imshow("Binary_image",binary)
#在二值化图像的基础上进行寻找轮廓
cloneImage,contours,heriachy=cv.findContours(binary,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
#循环打印出所有的轮廓
for i ,contour in enumerate(contours):
#将最后一个参数修改为-1即为填充。
cv.drawContours(image,contours,i,(255,0,255),2)
#显示图像
cv.imshow("Contours_demo",image)
src = cv.imread(r'F:\OutputResult\SrcImage\coins1.jpg')
cv.namedWindow("src",0)
cv.imshow("src",src)
image_Contours(src)
cv.waitKey(0)
cv.destroyAllWindows()
函数说明:
cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) 返回值有三个:image, contours, hierarchy
参数image:image图像源,8位单通道图像。非零像素被视为1。零像素保持0,因此图像被为二值图像。可以使用比较、范围内、阈值,
自适应阈值、canny和其他方法从灰度或彩色图像中创建二进制图像。
参数mode:模式轮廓检索模式。
参数method:轮廓近似法,参见轮廓近似模式。
参数contours:轮廓检测到轮廓。每个轮廓都存储为点的矢量。
参数hierarchy:层次可选输出向量。包含有关图像拓扑的信息。
参数offset:偏移每个轮廓点移动的可选偏移量。如果从图像ROI中提取轮廓,然后在整个图像中进行分析。
- 注意事项:图像若有噪声需要预先进行滤波,源图像的背景灰度值若远远大于待检测的轮廓物体则有可能导致在绘制填充模式下的轮廓图像被完全填充。
运行结果:
如下例:图像背景灰度值纯白色,最后轮廓检测后填充效果不是很好。