opencv for python (17) 绘制轮廓、轮廓特征

这篇博客介绍了如何利用OpenCV的cv2.findContours()函数寻找图像中的轮廓,并使用cv2.drawContours()进行绘制。同时,通过计算轮廓的矩、面积、周长等特性,分析图像对象的重心和面积。此外,还探讨了如何使用cv2.approxPolyDP()函数对不规则形状进行近似处理,以找到更接近矩形的形状。
摘要由CSDN通过智能技术生成

函数 cv2.findContours() 有三个参数,第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。返回值有两个,第一个是图像,第二个是轮廓,第三个是(轮廓的)层析结构。轮廓(第一个返回值)是一个 Python列表,其中存储这图像中的所有轮廓。每一个轮廓都是一个 Numpy 数组,包含对象边界点(x,y)的坐标。
函数 cv2.drawContours() 可以被用来绘制轮廓。它可以根据你提供的边界点绘制任何形状。它的第一个参数是原始图像,第二个参数是轮廓,一个 Python 列表。第三个参数是轮廓的索引(在绘制独立轮廓是很有用,当设置为 -1 时绘制所有轮廓)。接下来的参数是轮廓的颜色和厚度等

import cv2   
import numpy as np  

im = cv2.imread('t1_1.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,150,255,0)
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(imgray,contours,-1,(125,15,125),2)
cv2.imshow('original',im)
cv2.imshow('thresh',thresh)
cv2.imshow('final',imgray)
cv2.waitKey(0)

图像的矩可以帮助我们计算图像的质心,面积等
函数 cv2.moments() 会将计算得到的矩以一个字典的形式返回
根据这些矩M的值,我们可以计算出对象的重心
cx = int(M[‘m10’]/M[‘m00’])
cy = int(M[‘m01’]/M[‘m00’])
函数 cv2.contourArea() 计算得到轮廓的面积
函数 cv2.arcLength() 计算得到轮廓的周长,第二参数可以用来指定对象的形状是闭合的(True),还是打开的(一条曲
线)
假设我们要在一幅图像中查找一个矩形,但是由于图像的种种原因,我们不能得到一个完美的矩形,而是一个“坏形状”(如下图所示)。现在就可以使用这个函数来近似这个形状()了。这个函数的第二个参数叫
epsilon,它是从原始轮廓到近似轮廓的最大距离。它是一个准确度参数。选择一个好的 epsilon 对于得到满意结果非常重要。
原图
轮廓图
轮廓近似

import cv2   
import numpy as np  

im = cv2.imread('t1_.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,180,255,cv2.THRESH_BINARY)
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contours[0]
epsilon = 0.07*cv2.arcLength(cnt,True)
approx =  cv2.approxPolyDP(cnt,epsilon,True)
cv2.drawContours(imgray,[approx],-1,(125,25,0),5)
cv2.imshow('a',im)
cv2.imshow('b',thresh)
cv2.imshow('c',imgray)
cv2.waitKey(0)
M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
area = cv2.contourArea(cnt)
perimeter = cv2.arcLength(cnt,True)
print cx,cy,area,perimeter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值