python opencv 边缘检测_Python使用Opencv实现边缘检测以及轮廓检测的实现

边缘检测

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()

运行结果:

7489ba67ad227c4f75abdeaee3a05c11.png

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],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

原图:

1599b9f2de3e829785ed8f0601076667.png

示例一

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()

运行结果如图所示:

6d6fcd0d64de14a5bd81086843fe0b15.png

示例二

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()

运行结果如图所示:

c581f19ddcb92f25cf04079fbee2bdd8.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web程序入门五(http无状态)

Asp.net中的状态保持方案: ViewState:是donet特有的 微软提供的对象来完成状态保持 ViewState["key1"] 11; 赋值 键值对 形式 object类型 ViewState["key1"] 直接取值,将其转化成相应的类型 原理:本质…

排序算法之冒泡排序

注意第一个for循环i的范围是[1,sz - 1]; 第二个for循环的范围是[0,sz - i]; 因为是j 1<n,所以j < n - 1&#xff0c;所以i最小从1开始。 #include<iostream> #include<vector> using namespace std;void bubblesort(vector<int> &vec) {int sz ve…

vscode里面如何配置库_VS Code配置链接库文件

配置VS code在C语言中调用gsl库文件先确认gsl库&#xff0c;gcc都已正确安装&#xff0c;命令行g -L/usr/local/lib hello.c -o hello -lgsl -lgslcblas -lm没有错误则可以配置VS codetasks.json要配置args字段launch.json要配置environment字段c_cpp_properties.json要配置inc…

支付宝app支付java后台流程、原理分析(含nei wang chuan tou)

java版支付宝app支付流程及原理分析 本实例是基于springmvc框架编写 一、流程步骤 1.执行流程 当手机端app(就是你公司开发的app)在支付页面时&#xff0c;调起服务端(后台第1个创建订单接口)接口&#xff0c;后台把需要调起支付宝支付的参数返回给手机端…

python实现决策树数据直接赋值导入_决策树在python中的数据实现

我为python决策树算法实现完成了以下代码&#xff1a;from csv import readerdef load_csv(filename):file open(filename, "rb")lines reader(file)dataset list(lines)return dataset# Split a dataset based on an attribute and an attribute valuedef test_s…

互评Beta版本(Hello World!——SkyHunter)

1 基于NABCD评论作品&#xff0c;及改进建议 SkyHunter这款游戏我很喜欢&#xff0c;小时候总玩飞机类的游戏&#xff0c;这款游戏我上课的时候试玩了&#xff0c;在我电脑上运行是很好玩的&#xff0c;音乐震撼&#xff0c;画面玄幻&#xff0c;富有金属音乐的味道&#xff0c…

time是python的标准库吗_python3关于date和time的标准库

python3中关于日期和时间的标准库datetime和time&#xff0c;之前都是用的时候随用随查&#xff0c;今天系统的看一下用这两个库可以做些什么。1、time标准库#首先添加一个time对象&#xff0c;看一下该对象的属性和方法>>> import time,datetime>>> a time…

unshift() 方法将一个或多个元素添加到数组的开头,并返回新数组的长度

var arr [1, 2];arr.unshift(0); //result of call is 3, the new array length //arr is [0, 1, 2]arr.unshift(-2, -1); // 5 //arr is [-2, -1, 0, 1, 2]arr.unshift( [-3] ); //arr is [[-3], -2, -1, 0, 1, 2]语法 arr.unshift(element1, ..., elementN)参数列表 elemen…

acctype mysql assoc_DedeCMS V5.3二次开发经验分享

DedeCMS V5.3二次开发经验分享写在前面,DedeCMS系统的模板是非固定的&#xff0c;用户可以在新建栏目时可以自行选择栏目模板&#xff0c;官方仅提供最基本的默认模板&#xff0c;即是内置系统模型的各个模板&#xff0c;由于DedeCMS支持自定义频道模型&#xff0c;用户自定义新…

markdown基础语法整理

标题级别(一共六级) &#xff08;建议在#后加一个空格比较标准&#xff09; 通过在文字下方添加“”和“-”&#xff0c;他们分别表示一级标题和二级标题。在文字开头加上 “#”&#xff0c;通过“#”数量表示几级标题。&#xff08;共1~6级标题&#xff0c;级别越小字体越大&a…

mysql connector配置_mysql connector odbc配置注意事项

官方下载&#xff1a;http://dev.mysql.com/downloads/connector/odbc/有64位和32位版本&#xff0c;要根据自己的office版本是32还是64的安装1、版本匹配问题&#xff1a;[Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中&#xff0c;驱动程序和应用程序之间的体系结构不匹配…

安卓源码下载

SetupSecurityPortingTuningCompatibilityReference转到源代码SetupGetting StartedDownloading and Building RequirementsEstablishing a Build EnvironmentDownloading the SourcePreparing to BuildCompiling with JackUsing Reference BoardsRunning BuildsBuilding Kerne…

mysql 创建查询 删除_MYSQL数据库查询删除创建企业基本知识

数据查询语言(DQL)从表中获取数据select where (位置) order by(排序) group by haveby查询用户&#xff1a;select user,host,password from mysql.user;select user,host,password from mysql.usser order by(排序) 参数 (如user)asc(升序)select user,host&#xff0…

mysql 端口time_wait_linux上大量tcp端口处于TIME_WAIT的问题

最近发现在连接监控数据库的时候偶尔会连不上&#xff0c;报错&#xff1a;Couldnt connect to host:3306/tcp: IO::Socket::INET: connect: Cannot assign requested address查看了一下发现系统中存在大量处于TIME_WAIT状态的tcp端口$netstat -n | awk /^tcp/ {S[$NF]} END {f…

mysql常用命令英文词汇_MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档

MySQL在高并发连接、数据库记录数较多的情况下&#xff0c;SELECT ... WHERE ... LIKE %...%的全文搜索方式不仅效率差&#xff0c;而且以通配符%和_开头作查询时&#xff0c;使用不到索引&#xff0c;需要全表扫描&#xff0c;对数据库的压力也很大。MySQL针对这一问题提供了一…

SDN第二次作业

1、为什么需要SDN&#xff1f;SDN特点&#xff1f; 需要SDN的原因主要是&#xff1a;随着网络规模的不断扩大,封闭的网络设备内置了过多的复杂协议,增加了运营商定制优化网络的难度,科研人员无法在真实环境中规模部署新协议.同时,互联网流量的快速增长(预计到2018年,全球流量将…

mysql数据库sysdate_MySql数据库知识点复习

文章目录1. MySql数据类型1.1 数值类型1.2 字符串类型1.3 日期类型2.表记录的操作2.1 字段约束2.2 drop、delete、truncate之间的区别&#xff1f;3. MySql常见的函数4. 外键和表关系4.1 外键介绍4.2 添加外键4.3 表关系4.4 关联查询、外连接查询1. MySql数据类型1.1 数值类型M…

python函数-基础知识

一、含义函数是程序内的“小程序”二、示例 #!/usr/bin/env python #coding:utf-8 def hello():print(Hello world!)print(Hello people!) hello() 以上内容&#xff0c;定义了一个叫 hello() 的函数&#xff0c;执行该函数。第一行是 def 语句&#xff0c;它定义了一个名为 he…

python task done_python queue task_done()问题

我对python多线程队列有问题。我有一个脚本&#xff0c;其中producer从输入队列获取元素&#xff0c;生成一些元素并将它们放入输出队列&#xff0c;consumer从输出队列获取元素并打印它们&#xff1a;import threadingimport Queueclass Producer(threading.Thread):def __ini…

dobbo 简单框架

转载于:https://www.cnblogs.com/huangjianping/p/7986881.html