Python+OpenCV之图像轮廓详解

目录
  • 1. 图像轮廓
    • 1.1 findContours介绍
    • 1.2 绘制轮廓
    • 1.3 轮廓特征
  • 2. 轮廓近似
    • 2.1 轮廓
    • 2.2 边界矩形
    • 2.3 外界多边形及面积

1. 图像轮廓

1.1 findContours介绍

cv2.findContours(img, mode, method)

mode:轮廓检索模式

  • RETR_EXTERNAL :只检索最外面的轮廓;
  • RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
  • RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分 外部边界,第二层是空洞的边界;
  • RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;

method:轮廓逼近方法

  • CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
  • CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。

1.2 绘制轮廓

import cv2

def cv_show(img, name):
    cv2.imshow(name, img)
    cv2.waitKey()
    cv2.destroyAllWindows()

img = cv2.imread('DataPreprocessing/img/contours.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv_show(thresh, 'thresh')

contours.png原图展示:

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
cv_show(res, 'res')

“-1”表示显示所有轮廓,(B, G , R) = (0, 0, 255) 采用红色的显示全部轮廓,如下:

或者显示索引为1的轮廓,代码如下:

draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, 1, (0, 0, 255), 2)
cv_show(res, 'res')

索引为1的是三角形的内轮廓,0是外轮廓:

1.3 轮廓特征

cnt = contours[0]

# 面积
print("面积: ", cv2.contourArea(cnt))

# 周长,True表示闭合的
print("周长: ", cv2.arcLength(cnt, True))

输出:

面积: 8500.5
周长: 437.9482651948929

2. 轮廓近似

2.1 轮廓

contours2.png原图 :

img = cv2.imread('DataPreprocessing/img/contours2.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

draw_img = img.copy()
res = cv2.drawContours(draw_img, [cnt], -1, (0, 0, 255), 2)
cv_show(res, 'res')

边缘检测:

原理:以这个弧线为例, A , B A,B A,B端连线,取弧线上一点 C C C离线段 A B AB AB的距离最大,判断 d 1 d_{1} d1​是否小于设置的阈值 T T T, 不小于 T T T的,则以 A , C A,C A,C连接线段 A C AC AC,重复上面的操作,取得图中的 d 2 d_{2} d2​,再同 T T T做比较,直至 d n d_{n} dn​小于阈值得出线段为轮廓边缘。

2.2 边界矩形

img = cv2.imread('DataPreprocessing/img/contours.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

x, y, w, h = cv2.boundingRect(cnt)
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv_show(img, 'img')

2.3 外界多边形及面积

area = cv2.contourArea(cnt)
x, y, w, h = cv2.boundingRect(cnt)
rect_area = w * h
extent = float(area) / rect_area
print('轮廓面积与边界矩形比', extent)

输出:

轮廓面积与边界矩形比 0.5154317244724715

外接圆形:

(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
img = cv2.circle(img, center, radius, (0, 255, 0), 2)
cv_show(img, 'img')

结果展示:

到此这篇关于Python+OpenCV之图像轮廓详解的文章就介绍到这了,更多相关Python OpenCV图像轮廓内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python Opencv实现图像轮廓识别功能

    本文实例为大家分享了python opencv识别图像轮廓的具体代码,供大家参考,具体内容如下 要求:用矩形或者圆形框住图片中的云朵(不要求全部框出) 轮廓检测 Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.th

  • Python OpenCV 图像区域轮廓标记(框选各种小纸条)

    学在前面 上篇 OpenCV 博客原计划完成一个 识别银行卡号的项目,但是写的过程中发现,技术储备不足,我无法在下述图片中,提取出卡号区域,也就无法进行后续的识别了,再次意识到了自己技术还不达标,继续学习.完不成,就实现其它学习项目. 轮廓识别实战 先看一下最终实现的效果,针对一张图片(该图片前景色和背景色差异较大),进行轮廓标记. 图片基本处理 import cv2 as cv src = cv.imread("./demo.jpg") gray = cv.cvtColor(src,

  • Python OpenCV 基于图像边缘提取的轮廓发现函数

    基础知识铺垫 在图像中,轮廓可以简单的理解为连接具有相同颜色的所有连续点(边界)的曲线,轮廓可用于形状分析和对象检测.识别等领域. 轮廓发现的原理:先通过阈值分割提取目标物体,再通过边缘检测提取目标物体轮廓. 一个轮廓就是一系列的点(像素),这些点构成了一个有序的点集合. 使用 cv2.findContours 函数可以用来检测图像的边缘. 函数原型说明 contours, hierarchy = cv2.findContours(image, mode, method[, contours[,

  • python 基于opencv 绘制图像轮廓

    图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手:而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓. 寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图. 注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一

  • OpenCV-Python图像轮廓之轮廓特征详解

    目录 前言 一.轮廓的矩 二.轮廓的面积 三.轮廓的长度 四.轮廓的近似多边形 五.轮廓的凸包 六.轮廓的直边界矩形 七.轮廓的旋转矩形 八.轮廓的最小外包圆 九.轮廓的拟合椭圆 十.轮廓的拟合直线 十一.轮廓的最小外包三角形 前言 图像轮廓是指由位于边缘.连续的.具有相同颜色和强度的点构成的曲线,它可以用于形状分析以及对象检测和识别. 一.轮廓的矩 轮廓的矩包含了轮廓的各种几何特征,如面积.位置.角度.形状等.cv2.moments()函数用于返回轮廓的矩,其基本格式如下: ret = cv2

  • Python+OpenCV之图像轮廓详解

    目录 1. 图像轮廓 1.1 findContours介绍 1.2 绘制轮廓 1.3 轮廓特征 2. 轮廓近似 2.1 轮廓 2.2 边界矩形 2.3 外界多边形及面积 1. 图像轮廓 1.1 findContours介绍 cv2.findContours(img, mode, method) mode:轮廓检索模式 RETR_EXTERNAL :只检索最外面的轮廓: RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中: RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是

  • Python+OpenCV之图像梯度详解

    目录 1. Sobel算子 1.1 Sobel介绍 1.2 横向Sobel算子 1.3 纵向Sobel算子 1.4 合并横纵向的方法提取更好的边缘的结果 1.5 利用1.3方法绘制素描风格 2. Scharr算子 3. Laplacian算子 1. Sobel算子 OpenCV系列—本文底页有多个常用方法链接 1.1 Sobel介绍 cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和dy分别表示水平和竖直方向 ksize是Sobel算子的

  • 如何使用Python OpenCV提取物体轮廓详解

    通常提取物体的轮廓时,图像都存在噪声,提取效果并不理想.如提取下图的轮廓时, 提取代码: import cv2 img = cv2.imread("mouse.png") cv2.imshow("origin",img) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,binary = cv2.threshold(gray,128,255,cv2.THRESH_BINARY) cv2.imshow("bina

  • Python OpenCV绘制各类几何图形详解

    目录 一.绘制直线 二.绘制矩形 三.绘制圆形 四.绘制椭圆 五.绘制多边形 六.绘制文字 七.总结 一.绘制直线 在OpenCV中,绘制直线需要获取直线的起点和终点坐标,调用cv2.line()函数实现该功能.该函数原型如下所示: img = line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) – img表示需要绘制的那幅图像 – pt1表示线段第一个点的坐标 – pt2表示线段第二个点的坐标 – color表示线条颜色,需

  • Python OpenCV形态学运算示例详解

    目录 1. 腐蚀 & 膨胀 1.1什么是腐蚀&膨胀 1.2 腐蚀方法 cv2.erode() 1.3 膨胀方法 cv2.dilate() 2. 开运算 & 闭运算 2.1 简述 2.2 开运算 2.3 闭运算 3. morphologyEx()方法 3.1 morphologyEx()方法 介绍 3.2 梯度运算 3.3 顶帽运算 3.4 黑帽运算 1. 腐蚀 & 膨胀 1.1什么是腐蚀&膨胀 腐蚀&膨胀是图像形态学中的两种核心操作 腐蚀可以描述为是让图像沿

  • python OpenCV 实现高斯滤波详解

    目录 一.高斯滤波 二.C++代码 三.python代码 四.结果展示 1.原始图像 2.5x5卷积 3.9x9卷积 一.高斯滤波    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程. [1] 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到.高斯滤波的具体操作是:用一个模板(或称卷积.掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值. 二.C++代码

  • python opencv图像处理基本操作示例详解

    目录 1.图像基本操作 ①读取图像 ②显示图像 ③视频读取 ④图像截取 ⑤颜色通道提取及还原 ⑥边界填充 ⑦数值计算 ⑧图像融合 2.阈值与平滑处理 ①设定阈值并对图像处理 ②图像平滑-均值滤波 ③图像平滑-方框滤波 ④图像平滑-高斯滤波 ⑤图像平滑-中值滤波 3.图像的形态学处理 ①腐蚀操作 ②膨胀操作 ③开运算和闭运算 4.图像梯度处理 ①梯度运算 ②礼帽与黑帽 ③图像的梯度处理 5.边缘检测 ①Canny边缘检测 1.图像基本操作 ①读取图像 ②显示图像 该函数中,name是显示窗口的名字

  • Python OpenCV机器学习之图像识别详解

    目录 背景 一.人脸识别 二.车牌识别 三.DNN图像分类 背景 OpenCV中也提供了一些机器学习的方法,例如DNN:本篇将简单介绍一下机器学习的一些应用,对比传统和前沿的算法,能从其中看出优劣: 一.人脸识别 主要有以下两种实现方法: 1.哈尔(Haar)级联法:专门解决人脸识别而推出的传统算法: 实现步骤: 创建Haar级联器: 导入图片并将其灰度化: 调用函数接口进行人脸识别: 函数原型: detectMultiScale(img,scaleFactor,minNeighbors) sc

  • Python图像处理之图像金字塔详解

    目录 一.图像金字塔原理 二.图像向上取样 三.图像向下取样 四.总结 一.图像金字塔原理 上一篇文章讲解的图像采样处理可以降低图像的大小,本文将补充图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.如图10-1所示,它包括了四层图像,将

  • Python+OpenCV绘制灰度直方图详解

    1.直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比.图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征. 图像灰度直方图: 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少.图像的灰度直方图是灰度级的函数,描述的是图像中

随机推荐