美文网首页
图像轮廓之查找并绘制轮廓

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

作者: 大龙10 | 来源:发表于2021-11-05 06:54 被阅读0次

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

第12章 图像轮廓

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

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

12.1 查找并绘制轮廓

  • 一个轮廓对应着一系列的点,这些点以某种方式表示图像中的一条曲线。
  • 在OpenCV中,函数cv2.findContours()用于查找图像的轮廓,并能够根据参数返回特定表示方式的轮廓(曲线)。
  • 函数cv2.drawContours()能够将查找到的轮廓绘制到图像上,该函数可以根据参数在图像上绘制不同样式(实心/空心点,以及线条的不同粗细、颜色等)的轮廓,可以绘制全部轮廓也可以仅绘制指定的轮廓。

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

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

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

式中的返回值为:

  • contours:返回的轮廓。
  • hierarchy:图像的拓扑信息(轮廓层次)。

式中的参数为:

  • image:原始图像。8位单通道图像,所有非零值被处理为1,所有零值保持不变。也就是说灰度图像会被自动处理为二值图像。在实际操作时,可以根据需要,预先使用阈值处理等函数将待查找轮廓的图像处理为二值图像。
  • 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 显示前景对象的轮廓及前景对象

相关文章

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

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

  • 图像轮廓之轮廓拟合

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

  • 【图像处理】OpenCV系列二十四 --- 漫水填充(flood

    上一节我们学习了用如何用findContours函数对图像查找轮廓,以及用drawContours函数对查找的轮廓...

  • OpenCV-Python学习(十五):轮廓

    ...待更新...目录: 1.轮廓查找与绘制 2.面积,周长,重心 3.轮廓近似: approxPolyDP() ...

  • 图像轮廓

    边缘检测虽然能检测出边缘,但边缘是不连续的,并不是一个整体。图像轮廓是将边缘连接起来形成的一个整体,用于后续的计算...

  • 图像轮廓

    图像轮廓 什么是轮廓轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析...

  • opencv查找轮廓并配色

    记录目的 每次都要重新理解得到的层级树应该怎么处理,很麻烦,所以记一下,方便以后直接用。 查找轮廓 单纯查找轮廓部...

  • Python+OpenCV教程13:轮廓

    主站:http://ex2tron.wang原文:Python+OpenCV教程13:轮廓 学习如何寻找并绘制轮廓...

  • 轮廓特征之矩、面积、周长

    轮廓特征 查找轮廓的不同特征,例如矩、面积、周长等。 图像矩原始矩对于二维连续函数阶的矩被定义为图像矩对于=0,1...

  • opencv图像轮廓

    1.1什么是轮廓 cv2.findContours() 轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有...

网友评论

      本文标题:图像轮廓之查找并绘制轮廓

      本文链接:https://www.haomeiwen.com/subject/dewgaltx.html