Python+OpenCV之图像轮廓详解

 更新时间:2022年09月28日 14:42:48   作者:锦鲤AI幸运  
这篇文章主要为大家详细介绍了Python OpenCV实现图像轮廓的方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以了解一下

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图像轮廓内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 公众号接入chatGPT的详细教程 附Python源码

    公众号接入chatGPT的详细教程 附Python源码

    这篇文章主要介绍了公众号接入chatGPT教程附Python源码,这里需要大家准备一个域名,一台服务器和一个公众号,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 显卡驱动CUDA 和 pytorch CUDA 之间的区别

    显卡驱动CUDA 和 pytorch CUDA 之间的区别

    本文主要介绍了显卡驱动CUDA 和 pytorch CUDA 之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 探索Python元类与class语句协议掌握类的控制权

    探索Python元类与class语句协议掌握类的控制权

    这篇文章主要介绍了通过Python元类与class语句协议掌握类的控制权探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python requests上传文件实现步骤

    Python requests上传文件实现步骤

    这篇文章主要介绍了Python requests上传文件实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 使用python实现将excel数据导入word并设置字体样式的代码示例

    使用python实现将excel数据导入word并设置字体样式的代码示例

    在日常办公和数据处理中,我们经常需要将Excel中的数据导入到Word文档中,手动完成这个过程可能既费时又容易出错,本文将介绍如何使用Python自动化这一任务,需要的朋友可以参考下
    2024-02-02
  • python解决中文乱码问题的方法小结

    python解决中文乱码问题的方法小结

    在Python编程中,有时候我们会遇到中文乱码的问题,中文乱码指的是在输出或处理中文字符时,出现了显示错误或乱码的情况,下面我将介绍几种常见的解决方法,帮助你解决Python中的中文乱码问题,需要的朋友可以参考下
    2024-11-11
  • PyQT5 QTableView显示绑定数据的实例详解

    PyQT5 QTableView显示绑定数据的实例详解

    今天小编就为大家分享一篇PyQT5 QTableView显示绑定数据的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python MySQLdb Windows下安装教程及问题解决方法

    python MySQLdb Windows下安装教程及问题解决方法

    这篇文章主要介绍了python MySQLdb Windows下安装教程及问题解决方法,本文讲解了安装数据库mysql、安装MySQLdb等步骤,需要的朋友可以参考下
    2015-05-05
  • 使用 OpenAI API 和 Python 使用 GPT-3的操作方法

    使用 OpenAI API 和 Python 使用 GPT-3的操作方法

    这篇文章主要介绍了使用 OpenAI API 和 Python 使用 GPT-3,在本文中,我们将使用 GPT-3。我将向您展示如何访问它,并提供一些示例来说明您可以使用它做什么,以及您可以使用它构建什么样的应用程序,需要的朋友可以参考下
    2023-03-03
  • Python实现小数转化为百分数的格式化输出方法示例

    Python实现小数转化为百分数的格式化输出方法示例

    这篇文章主要介绍了Python实现小数转化为百分数的格式化输出方法,结合具体实例形式分析了Python实现小数转换为百分数输出的相关操作技巧与注意事项,需要的朋友可以参考下
    2017-09-09

最新评论