图像轮廓之查找并绘制轮廓

2021-11-05  本文已影响0人  大龙10

《OpenCV轻松入门:面向Python》读书笔记
作者:李立宗
出版社:电子工业出版社
出版时间:2019-05

第12章 图像轮廓

  边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。
  OpenCV提供了查找图像轮廓的函数cv2.findContours(),该函数能够查找图像内的轮廓信息,而函数cv2.drawContours()能够将轮廓绘制出来。

  图像轮廓是图像中非常重要的一个特征信息,通过对图像轮廓的操作,我们能够获取目标图像的大小、位置、方向等信息。

12.1 查找并绘制轮廓

1) 查找图像轮廓:findContours函数

函数cv2.findContours()的语法格式为:

contours, hierarchy = cv2.findContours( image, mode, method)

式中的返回值为:

式中的参数为:

2) 绘制图像轮廓:drawContours函数

在OpenCV中,可以使用函数cv2.drawContours()绘制图像轮廓。该函数的语法格式是:

image=cv2.drawContours(
image,
contours,
contourIdx,
color[,
thickness[,
lineType[,
hierarchy[,
maxLevel[,
offset]]]]] )

3) 轮廓实例1

【例12.1】绘制一幅图像内的所有轮廓。
如果要绘制图像内的所有轮廓,需要将函数cv2.drawContours()的参数contourIdx的值设置为“-1”。

#输出边缘和结构信息
import cv2
o = cv2.imread('contours.bmp')  
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)  
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  
contours, hierarchy = cv2.findContours(binary,
                                             cv2.RETR_EXTERNAL,
                                             cv2.CHAIN_APPROX_SIMPLE)  
o=cv2.drawContours(o,contours,-1,(0,0,255),5) 
cv2.imshow("result",o)    
cv2.waitKey()
cv2.destroyAllWindows()
图12-7 绘制所有轮廓

4) 逐个显示

【例12.2】逐个显示一幅图像内的边缘信息。

#输出边缘和结构信息
import cv2
import numpy as np
o = cv2.imread('contours.bmp')  
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)  
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  
contours, hierarchy = cv2.findContours(binary,
                                             cv2.RETR_EXTERNAL,
                                             cv2.CHAIN_APPROX_SIMPLE)  
n=len(contours)
contoursImg=[]
for i in range(n):
    temp=np.zeros(o.shape,np.uint8)
    contoursImg.append(temp)
    contoursImg[i]=cv2.drawContours(
            contoursImg[i],contours,i,(255,255,255),5) 
    cv2.imshow("contours[" + str(i)+"]",contoursImg[i])    
cv2.waitKey()
cv2.destroyAllWindows()
图12-8 逐一显示所有轮廓

5) 提取前景

【例12.3】使用轮廓绘制功能,提取前景对象。
将函数cv2.drawContours()的参数thickness的值设置为“-1”,可以绘制前景对象的实心轮廓。将该实心轮廓与原始图像进行“按位与”操作,即可将前景对象从原始图像中提取出来。

import cv2
import numpy as np
o = cv2.imread('loc3.jpg')
cv2.imshow("original",o)  
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)  
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  
contours, hierarchy = cv2.findContours(binary,
                                             cv2.RETR_LIST,
                                             cv2.CHAIN_APPROX_SIMPLE)  
mask=np.zeros(o.shape,np.uint8)
mask=cv2.drawContours(mask,contours,-1,(255,255,255),-1) 
cv2.imshow("mask" ,mask)
loc=cv2.bitwise_and(o,mask)    
cv2.imshow("location" ,loc)
cv2.waitKey()
cv2.destroyAllWindows()

本例中将函数cv2.drawContours()的参数thickness设置为“-1”,得到了前景对象的实心轮廓mask。接下来,通过语句“cv2.bitwise_and(o, mask)”,将原始图像o与实心轮廓mask进行“按位与”运算,就得到了原始图像的前景对象。


图12-9 显示前景对象的轮廓及前景对象
上一篇 下一篇

猜你喜欢

热点阅读