基于python使用OpenCV进行物体轮廓排序
作者:赵卓不凡? 发布时间:2022-06-27 23:25:01
1 引言
在进行图像处理过程中,我们经常会遇到一些和物体轮廓相关的操作,比如求目标轮廓的周长面积等,我们直接使用Opencv
的findContours
函数可以很容易的得到每个目标的轮廓,但是可视化后, 这个次序是无序的,如下图左侧所示:
本节打算实现对物体轮廓进行排序,可以实现从上到下排序或者从左倒右排序,达到上图右侧的可视化结果.
2 栗子
2.1 读取图像
首先,我们来读取图像,并得到其边缘检测图,代码如下:
image = cv2.imread(args['image'])
accumEdged = np.zeros(image.shape[:2], dtype='uint8')
for chan in cv2.split(image):
chan = cv2.medianBlur(chan, 11)
edged = cv2.Canny(chan, 50, 200)
accumEdged = cv2.bitwise_or(accumEdged, edged)
cv2.imshow('edge map', accumEdged)
运行结果如下:
左侧为原图,右侧为边缘检测图.
2.2 获取轮廓
opencv-python
中查找图像轮廓的API为:findContours
函数,该函数接收二值图像作为输入,可输出物体外轮廓、内外轮廓等等.
代码如下:
cnts = cv2.findContours(accumEdged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = grab_contours(cnts)
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:5]
orig = image.copy()
# unsorted
for (i, c) in enumerate(cnts):
orig = draw_contour(orig, c, i)
cv2.imshow('Unsorted', orig)
cv2.imwrite("./Unsorted.jpg", orig)
运行结果如下:
需要注意的是,在OpenCV2.X
版本,函数findContours
返回两个值,
函数声明如下:
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
但是在OpenCV3以上版本,该函数的声明形式如下:
image, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
所以为了适配两种模式,我们实现函数grab_contours
来根据不同的版本,选择对应的返回轮廓的下标位置,
代码如下:
def grab_contours(cnts):
# if the length the contours tuple returned by cv2.findContours
# is '2' then we are using either OpenCV v2.4, v4-beta, or
# v4-official
if len(cnts) == 2:
cnts = cnts[0]
# if the length of the contours tuple is '3' then we are using
# either OpenCV v3, v4-pre, or v4-alpha
elif len(cnts) == 3:
cnts = cnts[1]
return cnts
2.3 轮廓排序
通过上述步骤,我们得到了图像中的所有物体的轮廓,接下来我们定义函数sort_contours
函数来实现对轮廓进行排序操作,该函数接受method
参数来实现按照不同的次序对轮廓进行排序,比如从左往右,或者从右往左.
代码如下:
def sort_contours(cnts, method='left-to-right'):
# initialize the reverse flag and sort index
reverse = False
i = 0
# handle if sort in reverse
if method == 'right-to-left' or method == 'bottom-to-top':
reverse = True
# handle if sort against y rather than x of the bounding box
if method == 'bottom-to-top' or method == 'top-to-bottom':
i = 1
boundingBoxes = [cv2.boundingRect(c) for c in cnts]
(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes), key=lambda b: b[1][i], reverse=reverse))
return (cnts, boundingBoxes)
上述代码的核心思想为先求出每个轮廓的外接矩形框,然后通过对外接框按照x或y坐标排序进而来实现对轮廓的排序.
调用代码如下:
# sorted
(cnts, boundingboxes) = sort_contours(cnts, method=args['method'])
for (i, c) in enumerate(cnts):
image = draw_contour(image, c, i)
cv2.imshow('Sorted', image)
cv2.waitKey(0)
运行结果如下:
2.4 其他结果
利用上述代码,我们也可以实现从左往右的排序,如下所示:
3 总结
本文利用OpenCV实现了对物体轮廓按指定顺序进行排序的功能,并给出了完整的代码示例.
来源:https://blog.csdn.net/sgzqc/article/details/121981053?spm=1001.2014.3001.5502
猜你喜欢
- 原因添加一个文件 config.ini, 理论上说该文件会以ini文件格式打开,但是不知道咋的手贱用Text格式打开了。.ini正确打开方式
- 本文实例讲述了Python实现连接两个无规则列表后删除重复元素并升序排序的方法。分享给大家供大家参考,具体如下:# -*- coding:u
- Web Forms 2.0 是一个很有意思的东东,是 HTML 5 的组成部分。它的目标是提升表单的使用性 (usability),基本上就
- 前言今天给大家写一个个打地鼠小游戏,废话不多说直接开始~开发工具Python版本: 3.6.4相关模块:pygame模块;以及一些
- 当下,C#与Python都是比较热门的计算机编程语言,他们各有优缺点,如果能让他们互相配合工作,那是多么美好的事情,今天我来讲解一下如何利用
- 最近项目中需要实现两组图片对比,并能将两者的区别标识出来。在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下:想要实现此dem
- this指向当前作用域的对象,如果找不到,往上一层找,直到window。this 关键字很好用,很灵活,正因为很灵活,所以一不小心你就会掉进
- 在网页中,我们经常需要引用大量的javascript和css文件,在加上许多javascript库都包含debug版和经过压缩的releas
- 新上的一台服务器出现了一个现象:ASP程序中,调用函数Now(),显示的时间总是形如“2009-07-12 上午 08:12:56”这样的,
- 原理就是先声明常量,包括列数,行数,各列的属性,然后在程序的其它过程用这些常量来控制Cells。非常方便,便于修改和移植! 以下为窗体整体代
- PyQt5切换按钮控件QPushButton简介QAbstractButton类为抽象类,不能实例化,必须由其他的按钮类继承QAbstrac
- 本文列举了兼容 IE 和 FF 的换行 CSS 推荐样式,详细介绍了word-wrap同word-break的区别。兼容 IE 和 FF 的
- 一、条件控制Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块,而计算机很多自动化任务,也是根据
- ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写 的,主要用于创建前端用户界面,是一个与后台技术无关的
- 1、问题现象:有个网站是通过session验证的,前端时间访问正常,但近期后台session老是失效很快,根本没法操作,我设置timeout
- Windows客户端业务群产品营销主管斯蒂芬最近在向记者示范Internet Explorer 8 Beta2版浏览器的技术特征时标识,与用
- 给网页添加打印按钮,除了打印之外,还有页面设置、打印预览、复制本文链接到剪贴板等网页基本应用。正象我在图中标注的,大部分按钮只能适用于IE浏
- Mako是一个高性能的Python模板库,它的语法和API借鉴了很多其他的模板库,如Django、Jinja2等等。基本用法创建模板并渲染它
- 本文实例讲述了Python3.6基于正则实现的计算器。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#!pyt
- 一、css样式表滤镜的构成 滤镜作为样式表大家庭中的一员,它跟其他样式表元素的定义和应用方式当然是一样的,能够直接定义在HTML标识的<