使用Python和OpenCV对轮廓进行排序(从左到右,自上而下)

  • 1. 效果图
  • 2. 原理
  • 3. 源码
  • 参考
  • 使用轮廓来构建移动文档扫描仪。
  • 使用轮廓来检测图像中的条形码。
  • 利用轮廓来找到从相机到物体或标记的距离。

这一篇博客依然与轮廓相关,将介绍如何从左到右,从右到左,从上到下以及从下到上对轮廓进行排序。

1. 效果图

面积倒序 VS 自下而上排序 效果图如下:

面积倒序 VS 自右向左效果图如下:

2. 原理

  • cv2.boundingRect 计算轮廓的边界框区域

  • python魔法进行排序

  • 根据轮廓的大小/面积对轮廓进行排序

  • 仅使用一个功能即可从左到右,从右到左,从上到下以及从下到上对轮廓区域进行排序。

3. 源码

# USAGE
# python sorting_contours.py --image images/image_02.png --method "right-to-left"# 导入必要的类
import numpy as np
import argparse
import imutils
import cv2# 轮廓排序 默认从左到右
# --cnts 待排序的轮廓列表
# --method 排序方法 自上而下,从左到右等
def sort_contours(cnts, method="left-to-right"):# 初始化反向标志和排序索引reverse = Falsei = 0# 处理是否需要逆向排序if method == "right-to-left" or method == "bottom-to-top":reverse = True# 处理时根据边界框的x坐标排序还是y坐标排序,如果是自上而下或者自下而上则需要根据y坐标排序而不是x坐标if method == "top-to-bottom" or method == "bottom-to-top":i = 1# 构建边界框list 并使用python魔术lambda表达式进行排序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)# 绘制轮廓ID号
def draw_contour(image, c, i):# 计算轮廓区域的中心,并绘制⭕代表中心M = cv2.moments(c)cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])# 在图像上绘制轮廓数cv2.putText(image, "#{}".format(i + 1), (cX - 20, cY), cv2.FONT_HERSHEY_SIMPLEX,1.0, (255, 255, 255), 2)# 返回绘制了轮廓数的图像return image# 构建命令行参数及解析
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the input image")
ap.add_argument("-m", "--method", required=True, help="Sorting method")
args = vars(ap.parse_args())# 加载图像 并初始化累积的边缘图像
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)# 展示累积的图像边缘map
cv2.imshow("Edge Map", accumEdged)# 从图像种找到轮廓,保持最大的一个
cnts = cv2.findContours(accumEdged.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)# 根据轮廓面积从大到小排序,并取前5个
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:5]
orig = image.copy()# 遍历未排序的轮廓,并绘制在图像上
for (i, c) in enumerate(cnts):orig = draw_contour(orig, c, i)# 展示原始的,未排序的图
cv2.imshow("Unsorted", orig)
cv2.waitKey(0)# 根据提供的方法对轮廓进行排序
(cnts, boundingBoxes) = sort_contours(cnts, method=args["method"])# 遍历排序后的轮廓,并绘制在图像上
for (i, c) in enumerate(cnts):draw_contour(image, c, i)# 展示输出图像
cv2.imshow("Sorted", image)
cv2.waitKey(0)

参考

  • https://www.pyimagesearch.com/2015/04/20/sorting-contours-using-python-and-opencv/

使用Python和OpenCV对轮廓进行排序(从左到右,自上而下)相关推荐

  1. Python,OpenCV提取图片中的多个茄子种子轮廓,并按从左到右排序后显示

    Python,OpenCV提取图片中的多个茄子种子轮廓,并按从左到右排序后显示 1. 效果图 2. 源码 写这篇博客源于博友的提问,期望把下图中的多个茄子种子按从左到右的顺序提取出来: 1. 效果图 ...

  2. Python,OpenCV应用轮廓逼近算法,检测对象的形状

    上一篇博客,我们学习了如何利用Python.OpenCV计算轮廓的中心,这一节学习仅运用轮廓的基本属性来检测其形状,三角形,正方形,矩形,五边形,圆. (1)利用轮廓逼近,将曲线上的点数减少为更简单的 ...

  3. 使用Python、OpenCV计算轮廓的中心

    1. 使用Python.OpenCV计算轮廓的中心并标记 2. 使用Python.OpenCV检测轮廓的形状并标记 3. 使用颜色通道统计信息来标记形状的实际颜色并标记 本博客的目标:(1)检测图像中 ...

  4. 使用Python,OpenCV沿着轮廓寻找极值点

    使用Python,OpenCV沿着轮廓寻找极值点 这篇博客将介绍如何使用Python,OpenCV沿着轮廓寻找极值点,找到最北.最南.最东和最西(x,y)坐标.虽然这项技能本身并不有用,但它通常被用作 ...

  5. python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv

    1.轮廓发现 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 1.1发现轮廓 在此步骤中我们会使用到findContours这个API,其原型为: ...

  6. python使用opencv查找轮廓_(八)OpenCV-Python学习—轮廓查找,绘制和拟合

    针对物体轮廓,opencv还提供了一些相关的函数,来处理轮廓查找,绘制,拟合,以及计算轮廓周长和面积等,详细介绍如下: 1. 寻找和绘制轮廓 opencv的findContours()能寻找图片中的轮 ...

  7. python 使用opencv找轮廓

    def find_counts(subtracted_img,img, cross_s_text, border_coord, ratio):# height, width = img.shape[: ...

  8. python表格对齐_python 格式化输出 列表对齐左对齐右对齐

    原博文 2020-10-14 09:30 − python对齐输出 https://www.cnblogs.com/nul1/p/11136495.html python - 输出列表自动对齐(支持中 ...

  9. python列表中的索引问题:从左到右由0开始;从右到左由-1开始

    在程序猿的世界,数字是从0开始的,这个同样适用于python语言中的列表索引,我们建立了列表之后,如果要查询或者读取其中的第n个元素,这个元素的索引值并不是n,而是n-1,因为第一1个元素的索引编号是 ...

最新文章

  1. 字节2020算法岗校招一面
  2. 向所有的代码小神童学习!
  3. 77种互联网盈利创新模式(3)
  4. jar导出与制作成exe在没jdk电脑下运行(图文教程+工具)
  5. Duilib自定义控件
  6. 各种多媒体软件安装教程
  7. java单例模式——详解JAVA单例模式及8种实现方式
  8. ROS 5.24软路由系统 安装+部署+联网 参考教程(ISO版)
  9. Linux文件帮助_重定向_vi
  10. 不改变图片尺寸,将图片内存调大
  11. 练遇24H智能健身房获巨额融资,突破传统局限,打造新健身时代
  12. redis-redis官网下载步骤(包含windows版)
  13. 系统架构设计的一点思考
  14. 在线绘图软件——ProcessOn
  15. 关于chrome、edge浏览器f12开发者模式的application中无法添加参数的问题
  16. Kindle的使用体验
  17. std__vector介绍
  18. 秒表工具类StopWatch
  19. 2维旋转矩阵的推导方式
  20. html中listbox效果,listbox控件的使用

热门文章

  1. java equal hashcode_Java(二)equal 和 hashcode使用
  2. git user name is not defined
  3. Docker安装weblogic(五)
  4. centOS7 LNMP+phpmyadmin环境搭建 第三篇phpmyadmin安装
  5. Go 学习笔记(6)— 变量定义、变量声明、变量作用域
  6. 《大道至简》读后感(伪代码)
  7. Scala 集合入门
  8. 重写浏览器alert解决ios端原生alert出现当前网址的URL
  9. hdu5296 01字典树
  10. Strusts2笔记7--国际化