一、简介
轮廓发现:是基于图像边缘提取的基础上寻找对象轮廓的方法。所以边缘提取的阈值选择将会影响最终轮廓的发现。轮廓提取的API可以是边缘提取后的图像,也可以是直接二值化的图像
二、实战
两种方法都可以使用,根据实际情况选择。
2.1 基于二值图像
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
'''二值图像直接作为轮廓提取API的输入'''
def find_contours_binary_demo(image):
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#得到二值图像
ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
cv.imshow('binary',binary)
#提取边缘
cloneImage,contours,Heriachy=cv.findContours(binary,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
for i,contour in enumerate(contours):
#绘制边缘
cv.drawContours(image, contours, i, (0, 0, 255), 2)
#cv.drawContours(image,contours,i,(0,0,255),-1)#填充轮廓可以直接将最后一个参数置为-1
cv.imshow('find_contours', image)
img = cv.imread(r'D:\Project\Opencv\Learning01\angelababy.jpg')
cv.imshow('origin',img)
find_contours_binary_demo(img)
cv.waitKey(0)
2.2 基于边缘提取图像
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
'''边缘提取后的图像作为轮廓提取API的输入'''
def find_contours_Canny_demo(image):
# 1.高斯模糊:最后两个参数给定一个就可以自动求取另一个,所以只给其中一个赋值就可以
blur=cv.GaussianBlur(image,(3,3),0)
#2.灰度处理
gray=cv.cvtColor(blur,cv.COLOR_BGR2GRAY)
#3.求取梯度,也可以不用梯度,直接将灰度图传入cv.canny
grad_x=cv.Sobel(gray,cv.CV_16SC1,1,0)
grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
#4.得到提取边缘后的图像
edge_output=cv.Canny(grad_x,grad_y,50,150)#参数:x梯度,y梯度 ,低阈值,高阈值
cv.imshow('binary',edge_output)
#提取边缘
cloneImage,contours,Heriachy=cv.findContours(edge_output,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
for i,contour in enumerate(contours):
#绘制边缘
cv.drawContours(image, contours, i, (0, 0, 255), 2)
#cv.drawContours(image,contours,i,(0,0,255),-1)#填充轮廓可以直接将最后一个参数置为-1
cv.imshow('find_contours', image)
img = cv.imread(r'D:\Project\Opencv\Learning01\angelababy.jpg')
cv.imshow('origin',img)
find_contours_Canny_demo(img)
cv.waitKey(0)