Python使用Opencv实现边缘检测以及轮廓检测的实现


Posted in Python onDecember 31, 2020

边缘检测

Canny边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化。

Canny边缘检测器算法基本步骤:

  • 平滑图像:通过使用合适的模糊半径执行高斯模糊来减少图像内的噪声。
  • 计算图像的梯度:这里计算图像的梯度,并将梯度分类为垂直、水平和斜对角。这一步的输出用于在下一步中计算真正的边缘。
  • 非最大值抑制:利用上一步计算出来的梯度方向,检测某一像素在梯度的正方向和负方向上是否是局部最大值,如果是,则抑制该像素(像素不属于边缘)。这是一种边缘细化技术,用最急剧的变换选出边缘点。
  • 用滞后阈值化选择边缘:最后一步,检查某一条边缘是否明显到足以作为最终输出,最后去除所有不明显的边缘。

Opencv使用Canny边缘检测相对简单,代码如下:

import cv2
import numpy as np

img = cv2.imread("hammer.jpg", 0)
cv2.imwrite("canny.jpg", cv2.Canny(img, 200, 300))
cv2.imshow("canny", cv2.imread("canny.jpg"))
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

Python使用Opencv实现边缘检测以及轮廓检测的实现

Canny函数的原型为

cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])

必要参数:
第一个参数是需要处理的原图像,该图像必须为单通道的灰度图;
第二个参数是滞后阈值1;
第三个参数是滞后阈值2。

轮廓检测

轮廓检测主要由cv2.findContours函数实现的。
函数的原型为

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

函数参数
第一个参数是寻找轮廓的图像;

第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):

  • cv2.RETR_EXTERNAL表示只检测外轮廓 。
  • cv2.RETR_LIST检测的轮廓不建立等级关系。
  • cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
  • cv2.RETR_TREE建立一个等级树结构的轮廓。

第三个参数method为轮廓的逼近方法

  • cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1。
  • cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。
  • cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_APPROX_TC89_KCOS都是使用teh-Chinl chain近似算法。

返回值

如:image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

image:是原图像

contours:图像的轮廓,以列表的形式表示,每个元素都是图像中的一个轮廓。

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

原图:

Python使用Opencv实现边缘检测以及轮廓检测的实现

示例一

import cv2
import numpy as np

img = cv2.pyrDown(cv2.imread("hammer.jpg", cv2.IMREAD_UNCHANGED))
# threshold 函数对图像进行二化值处理,由于处理后图像对原图像有所变化,因此img.copy()生成新的图像,cv2.THRESH_BINARY是二化值
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_BINARY)
# findContours函数查找图像里的图形轮廓
# 函数参数thresh是图像对象
# 层次类型,参数cv2.RETR_EXTERNAL是获取最外层轮廓,cv2.RETR_TREE是获取轮廓的整体结构
# 轮廓逼近方法
# 输出的返回值,image是原图像、contours是图像的轮廓、hier是层次类型
image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for c in contours:
  # 轮廓绘制方法一
  # boundingRect函数计算边框值,x,y是坐标值,w,h是矩形的宽和高
  x, y, w, h = cv2.boundingRect(c)
  # 在img图像画出矩形,(x, y), (x + w, y + h)是矩形坐标,(0, 255, 0)设置通道颜色,2是设置线条粗度
  cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

  # 轮廓绘制方法二
  # 查找最小区域
  rect = cv2.minAreaRect(c)
  # 计算最小面积矩形的坐标
  box = cv2.boxPoints(rect)
  # 将坐标规范化为整数
  box = np.int0(box)
  # 绘制矩形
  cv2.drawContours(img, [box], 0, (0, 0, 255), 3)

  # 轮廓绘制方法三
  # 圆心坐标和半径的计算
  (x, y), radius = cv2.minEnclosingCircle(c)
  # 规范化为整数
  center = (int(x), int(y))
  radius = int(radius)
  # 勾画圆形区域
  img = cv2.circle(img, center, radius, (0, 255, 0), 2)

# # 轮廓绘制方法四
# 围绕图形勾画蓝色线条
cv2.drawContours(img, contours, -1, (255, 0, 0), 2)
# 显示图像
cv2.imshow("contours", img)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果如图所示:

Python使用Opencv实现边缘检测以及轮廓检测的实现

示例二

import cv2
import numpy as np

img = cv2.pyrDown(cv2.imread("hammer.jpg", cv2.IMREAD_UNCHANGED))
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY) , 127, 255, cv2.THRESH_BINARY)
# findContours函数查找图像里的图形轮廓
# 函数参数thresh是图像对象
# 层次类型,参数cv2.RETR_EXTERNAL是获取最外层轮廓,cv2.RETR_TREE是获取轮廓的整体结构
# 轮廓逼近方法
# 输出的返回值,image是原图像、contours是图像的轮廓、hier是层次类型
image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 创建新的图像black
black = cv2.cvtColor(np.zeros((img.shape[1], img.shape[0]), dtype=np.uint8), cv2.COLOR_GRAY2BGR)


for cnt in contours:
  # 轮廓周长也被称为弧长。可以使用函数 cv2.arcLength() 计算得到。这个函数的第二参数可以用来指定对象的形状是闭合的(True) ,还是打开的(一条曲线)
  epsilon = 0.01 * cv2.arcLength(cnt, True)
  # 函数approxPolyDP来对指定的点集进行逼近,cnt是图像轮廓,epsilon表示的是精度,越小精度越高,因为表示的意思是是原始曲线与近似曲线之间的最大距离。
  # 第三个函数参数若为true,则说明近似曲线是闭合的,它的首位都是相连,反之,若为false,则断开。
  approx = cv2.approxPolyDP(cnt, epsilon, True)
  # convexHull检查一个曲线的凸性缺陷并进行修正,参数cnt是图像轮廓。
  hull = cv2.convexHull(cnt)
  # 勾画图像原始的轮廓
  cv2.drawContours(black, [cnt], -1, (0, 255, 0), 2)
  # 用多边形勾画轮廓区域
  cv2.drawContours(black, [approx], -1, (255, 255, 0), 2)
  # 修正凸性缺陷的轮廓区域
  cv2.drawContours(black, [hull], -1, (0, 0, 255), 2)
# 显示图像
cv2.imshow("hull", black)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果如图所示:

Python使用Opencv实现边缘检测以及轮廓检测的实现

参考资料:OpenCV 3计算机视觉 Python语言实现第二版

到此这篇关于Python使用Opencv实现边缘检测以及轮廓检测的实现的文章就介绍到这了,更多相关Python 边缘检测内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python将html转成PDF的实现代码(包含中文)
Mar 04 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
Jul 06 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
May 15 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
python 执行终端/控制台命令的例子
Jul 12 Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
python Popen 获取输出,等待运行完成示例
Dec 30 Python
Python GUI库PyQt5样式QSS子控件介绍
Feb 25 Python
Django Form设置文本框为readonly操作
Jul 03 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
python 检测nginx服务邮件报警的脚本
Dec 31 #Python
Django 实现图片上传和下载功能
Dec 31 #Python
Python wordcloud库安装方法总结
Dec 31 #Python
Python的信号库Blinker用法详解
Dec 31 #Python
浅析python实现动态规划背包问题
Dec 31 #Python
python中doctest库实例用法
Dec 31 #Python
Python项目打包成二进制的方法
Dec 30 #Python
You might like
PHP初学者头疼问题总结
2006/07/08 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Pyhton中防止SQL注入的方法
2015/02/05 Python
python生成二维码的实例详解
2017/10/29 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
家居饰品店创业计划书
2014/01/31 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
第一书记观后感
2015/06/08 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏