Python+OpenCV图像处理(十六)—— 轮廓发现

简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果。

代码如下:

import cv2 as cv
import numpy as np
def contours_demo(image):
    dst = cv.GaussianBlur(image, (3, 3), 0) #高斯模糊去噪
    gray = cv.cvtColor(dst, cv.COLOR_RGB2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #用大律法、全局自适应阈值方法进行图像二值化
    cv.imshow("binary image", binary)
    cloneTmage, contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i, contour in enumerate(contours):
        cv.drawContours(image, contours, i, (0, 0, 255), 2)
        print(i)
    cv.imshow("contours", image)
    for i, contour in enumerate(contours):
        cv.drawContours(image, contours, i, (0, 0, 255), -1)
    cv.imshow("pcontours", image)
src = cv.imread(‘E:/imageload/coins.jpg‘)
cv.namedWindow(‘input_image‘, cv.WINDOW_NORMAL) #设置为WINDOW_NORMAL可以任意缩放
cv.imshow(‘input_image‘, src)
contours_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

注意:

1.Opencv发现轮廓的函数原型为:findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> image, contours, hierarchy

image参数表示8位单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像。

mode参数表示轮廓检索模式:

①CV_RETR_EXTERNAL:只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略。

②CV_RETR_LIST:检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓。

③CV_RETR_CCOMP:检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层。

④CV_RETR_TREE:检测所有轮廓,所有轮廓建立一个等级树结构,外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。

method参数表示轮廓的近似方法:

①CV_CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max (abs (x1 - x2), abs(y2 - y1) == 1。

②CV_CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。

③CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法。

contours参数是一个list,表示存储的每个轮廓的点集合。

hierarchy参数是一个list,list中元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

offset参数表示每个轮廓点移动的可选偏移量。

2.Opencv绘制轮廓的函数原型为:drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) -> image

imgae参数表示目标图像。

contours参数表示所有输入轮廓。

contourIdx参数表示绘制轮廓list中的哪条轮廓, 如果是负数,则绘制所有轮廓。

color参数表示轮廓的颜色。

thickness参数表示绘制的轮廓线条粗细,如果是负数,则绘制轮廓内部。

lineType参数表示线型。

hierarchy参数表示有关层次结构的可选信息。

maxLevel参数表示绘制轮廓的最大级别。 如果为0,则仅绘制指定的轮廓。 如果为1,则该函数绘制轮廓和所有嵌套轮廓。 如果为2,则该函数绘制轮廓,所有嵌套轮廓,所有嵌套到嵌套的轮廓,等等。 仅当有可用的层次结构时才考虑此参数。

offset参数表示可选的轮廓偏移参数,该参数可按指定的方式移动所有绘制的轮廓。

原文地址:https://www.cnblogs.com/FHC1994/p/9462144.html

时间: 2024-10-03 09:42:28

Python+OpenCV图像处理(十六)—— 轮廓发现的相关文章

Python进阶(三十六)-Web框架Django项目搭建全过程

Python进阶(三十六)-Web框架Django项目搭建全过程 ??IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 ??Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! Django 特点 强大的数据库功能 用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句. 自带的强大的后台功能 几行简单的代码就让你的网

Python+OpenCV图像处理(一)——读取显示一张图片

配置好所有环境后,开始利用python+opencv进行图像处理第一步. 读取和显示一张图片: import cv2 as cv src=cv.imread('E:\imageload\example.png') cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) cv.imshow('input_image', src) cv.waitKey(0) cv.destroyAllWindows() 输出效果: 代码解释: src=cv.imread(

Python+OpenCV图像处理(十四)—— 直线检测

简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段). 2.Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等) 3.霍夫线变

python+opencv图像处理(一)

一.什么是opencv?  Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效--由一系列 C 函数和少量C++类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法.最新版本是3.1 ,201

Python+OpenCV图像处理之模板匹配

模板匹配就是在整个图像区域中发现与给定子图像匹配的小块区域 在OpenCV中,提供了相应的函数完成这个操作: matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像 minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置 几种常见的模板匹配算法: ①TM_SQDIFF是平方差匹配:TM_SQDIFF_NORMED是标准平方差匹配.利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大. ②TM_CCORR是相关性匹配:TM_CCORR_NORMED

Python+OpenCV图像处理之对象测量

OpenCV中经常会测量对象的面积,周长,质心,边界框等 求图形几何矩中心 并求最小外接矩形python实现 import cv2 import numpy as np __author__ = "boboa" def measure_demo(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.T

python学习笔记十六 django深入学习一

django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), #精确匹配 url(r'^articles/([0-9]{4})/$', views.year_archive), #动态路由 url(r'^articles/([0-9]{4})/([0-9]{2

笨办法学Python(三十六)

习题 36: 设计和调试 现在你已经学会了"if 语句",我将给你一些使用"for 循环"和"while 循环"的规则,一面你日后碰到麻烦.我还会教你一些调试的小技巧,以便你能发现自己程序的问题.最后,你将需要设计一个和上节类似的小游戏,不过内容略有更改. If 语句的规则 每一个"if 语句"必须包含一个 else. 如果这个 else 永远都不应该被执行到,因为它本身没有任何意义,那你必须在 else 语句后面使用一个叫做

Python+OpenCV图像处理(七)—— 滤波与模糊操作

过滤是信号和图像处理中基本的任务.其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息.过滤可以移除图像中的噪音.提取感兴趣的可视特征.允许图像重采样等等.频域分析将图像分成从低频到高频的不同部分.低频对应图像强度变化小的区域,而高频是图像强度变化非常大的区域.在频率分析领域的框架中,滤波器是一个用来增强图像中某个波段或频率并阻塞(或降低)其他频率波段的操作.低通滤波器是消除图像中高频部分,但保留低频部分.高通滤波器消除低频部分.参考博客:https://blog.csdn.net