热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

opencvpython边缘检测和轮廓提取

文章目录前言一、边缘检测二、轮廓提取1.非边缘检测轮廓提取2.边缘检测和轮廓调节总结前言opencv中的边缘检测和轮廓提取都是图像识别的重要部分提示:以下是本篇文章

文章目录

  • 前言
  • 一、边缘检测
  • 二、轮廓提取
    • 1.非边缘检测轮廓提取
    • 2.边缘检测和轮廓调节
  • 总结




前言

opencv中的边缘检测和轮廓提取都是图像识别的重要部分


提示:以下是本篇文章正文内容,下面案例可供参考

一、边缘检测

Canny边缘检测算子是一个多级边缘检测算法,Canny的目标是找到一个最优的边缘检测算法,其评价标准为:低错误率、高定位性、最小响应。

Canny边缘检测步骤
Canny函数
Python:
edges = cv.Canny( image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]] )
image 源图像,需是单通道8位图像
edges 输出的边缘图像,需和源图像具有一样的大小和类型
threshold1 第一个滞后性阀值,double
threshold2 第二个滞后性阀值,double
apertureSize 应用Sobel算子孔径大小,默认值:3
L2gradient a flag, indicating whether a more accurate L 2 norm =(dI/dx) 2 +(dI/dy) 2 − − − − − − − − − − − − − − − − √ should be used to calculate the image gradient magnitude ( L2gradient=true ), or whether the default L 1 norm =|dI/dx|+|dI/dy| is enough ( L2gradient=false ).

import cv2 as cv
import numpy as npdef edge_demo(image):blurred = cv.GaussianBlur(image, (3, 3), 0) # 高斯模糊gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY) # 灰路图像xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0) # xGrodientygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1) # yGrodientedge_output = cv.Canny(xgrad, ygrad, 100, 150) # edgecv.imshow("Canny Edge",edge_output)# # 彩色边缘# dst = cv.bitwise_and(image, image, mask=edge_output)# cv.imshow("Color Edge", dst)src=cv.imread("D:\\1111.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
edge_demo(src)
cv.waitKey(0)cv.destroyAllWindows()

二、轮廓提取

1.非边缘检测轮廓提取

先将图片进行高斯模糊,然后变成灰路图像,再将图片二值化,最后将图片进行轮廓提取。

代码如下(示例):
这个方法有一个缺点就是自动二值化的阙值会对轮廓提取产生影响,虽然可以自己定义阙值,但是不能每一章照片进行一次调节。

import cv2 as cv
def contours_demo(image):blurred = cv.GaussianBlur(image, (3, 3), 0)gray = cv.cvtColor(blurred, cv.COLOR_RGB2GRAY) # 灰路图像# ret , binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY| cv.THRESH_OTSU) # 图像二值化ret, binary = cv.threshold(gray, 68, 255, cv.THRESH_BINARY ) # 图像二值化cv.imshow("binary image",binary)contours, heriachy = cv.findContours(binary,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)for i, contour in enumerate(contours):cv.drawContours(image,contours,i,(0,0,255),6) #6的改为-1可以填充print(i)cv.imshow("detect contours", image)src=cv.imread("D:\\1111.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
#cv.imshow("input image",src)
contours_demo(src)
cv.waitKey(0)cv.destroyAllWindows()

2.边缘检测和轮廓调节

代码如下(示例):

import cv2 as cvdef edge_demo(image):blurred = cv.GaussianBlur(image, (3, 3), 0) # 高斯模糊gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY) # 灰路图像xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0) # xGrodientygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1) # yGrodientedge_output = cv.Canny(xgrad, ygrad, 100, 150) # edgereturn edge_outputdef contours_demo(image):# blurred = cv.GaussianBlur(image, (3, 3), 0)# gray = cv.cvtColor(blurred, cv.COLOR_RGB2GRAY) # 灰路图像# # ret , binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY| cv.THRESH_OTSU) # 图像二值化# ret, binary = cv.threshold(gray, 68, 255, cv.THRESH_BINARY ) # 图像二值化# cv.imshow("binary image",binary)binary = edge_demo(image)contours, heriachy = cv.findContours(binary,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)for i, contour in enumerate(contours):cv.drawContours(image,contours,i,(0,0,255),6) #6的改为-1可以填充print(i)cv.imshow("detect contours", image)src=cv.imread("D:\\1111.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
#cv.imshow("input image",src)
contours_demo(src)
cv.waitKey(0)cv.destroyAllWindows()

这样就可以避免掉方法一产生的问题,并且还可以很好的实现轮廓的提取



总结

鸣谢
https://blog.csdn.net/weixin_42261213/article/details/93990410
https://blog.csdn.net/miao0967020148/article/details/88623631


推荐阅读
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
author-avatar
mobiledu2502896593
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有