十七、轮廓发现

一、轮廓发现原理

轮廓发现是在图像边缘提取的基础上寻找对象轮廓的方法,故边缘提取的阈值的选定会影响到最终轮廓发现的结果。
其本质是基于二值图像的,边缘提取常用Canny进行提取边缘
轮廓发现也是基于拓扑结构,扫描连通图,最后建立其树形结构的拓扑图
通常情况可以利用梯度来避免阈值的错误设定

二、代码实现

cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
binary:二值图像
cv2.RETR_TREE:二值图像返回结果构建模型的方法,即构建轮廓的方法,返回树形结构
cv2.CHAIN_APPROX_SIMPLE:一般为简单的返回形式
cloneImage:克隆图片信息,可忽略
contours:存放返回轮廓信息,最有用
heriachy :存放轮廓层次信息,可忽略

cv2.drawContours(image,contours,i,(0,0,255),2)
image:图像信息
contours:存放轮廓信息,绘制哪个轮廓,会从contours中找
(0,0,255):绘制轮廓的颜色
2:绘制轮廓的线宽

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#先转换为灰度图ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

三、加上滤波代码实现

cv2.GaussianBlur(image,(3,3),0)高斯滤波,卷积核大小为3*3

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先转换为灰度图ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

四、找大轮廓

cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.RETR_EXTERNAL:返回最大轮廓结果

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先转换为灰度图ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

五、填充轮廓

cv2.drawContours(image,contours,i,(0,0,255),-1)
最后一个参数为绘制轮廓线段的宽度,-1表示填充

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先转换为灰度图ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),-1)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述

六、Canny提取轮廓

import cv2
import numpy as np
from matplotlib import pyplot as pltdef edge(image):blurred = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(blurred,cv2.COLOR_BGR2GRAY)xgrad = cv2.Sobel(gray,cv2.CV_16SC1,1,0)#x Gradientygrad = cv2.Sobel(gray,cv2.CV_16SC1,0,1)#y Gradientedge_output = cv2.Canny(gray,50,150)cv2.imshow("Canny Edge",edge_output)return edge_outputdef contour(image):binary = edge(image)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),-1)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

七、若寻找轮廓寻找到图像最外边缘,取反一下即可

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先转换为灰度图ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\by.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

解决方法:cv2.THRESH_BINARY_INV

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先转换为灰度图ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\by.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

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

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

相关文章

关于 WebRequest.RegisterPrefix

RegisterPrefix 方法将 WebRequest 子代注册到服务请求。 WebRequest 后代通常被注册来处理特定的协议(例如 HTTP 或 FTP),但也可能被注册来处理对特定服务器或服务器上的路径的请求。 已注册的预注册保留类型包括下列类型: htt…

LeetCode 404. 左叶子之和思考分析

题目 计算给定二叉树的所有左叶子之和。 如果是下面的树,只有一个左叶子结点4 思考分析 由此我们可以得到左叶子结点的定义: cur->left !NULL && cur->left->leftNULL && cur->left->rightNULL 递归遍历累积操作 …

天王盖地虎

1&#xff0c;求有序数列中某个元素的个数 思想&#xff1a;二分找上下界&#xff1a; int element_count(int * set, int len, int e) {int f, a, b, t;for(a 0, b len - 1; a < b; set[t a b >> 1] < e ? (a t 1) : (b t - 1));for(f a, b len - 1; a…

ruby array_Ruby中带有示例的Array.cycle()方法

ruby arrayArray.cycle()方法 (Array.cycle() Method) In this article, we will study about Array.cycle() method. You must be a little more excited to read about Array.cycle method due to its catchy name as I was pretty amazed after reading this method. In the…

十八、对已经找到轮廓的图像进行测量

图像轮廓的获取可参考博文十七 一、相关原理 1&#xff0c;弧长和面积 对于弧长和面积&#xff0c;计算出来的轮廓单位都是像素 2&#xff0c;多边形拟合 每一个轮廓都是一系列的点&#xff0c;然后通过多边形进行拟合&#xff0c;无限的接近真实形状 相关API&#xff1a;…

Linux 终端登录SSH:解决SSH的Access Denied 和 make xconfig的使用

对于SSH&#xff1a; 可以不是用putty&#xff0c;尤其是putty出现 Access denied 的时候&#xff0c;请换用konsole 或者其他终端 &#xff08;如 terminal&#xff09;在command line中&#xff1a; # ssh 要访问的主机ip eg &#xff1a; ssh 192.168.111 然后确定…

LeetCode 513. 找树左下角的值 思考分析

题目 给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 递归解 左下角要满足两个条件&#xff1a; 1、深度最大的叶子结点 2、最左结点&#xff1a;使用前序遍历&#xff0c;优先左边搜索。 1、确定递归函数的参数和返回值 参数&#xff1a;树的根结点&#xff…

利用MyBatis的动态SQL特性抽象统一SQL查询接口

1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射的方法构造多查询参数.在遇到多属性参数(例如order by,其参数包括列名,升序降序类型,以及可以多个列及…

ctype函数_PHP Ctype(字符类型)函数

ctype函数Ctype功能 (Ctype functions) PHP provides some of the built-in functions, which are used to verify the characters in the string i.e. to check whether a string contains the characters of specific types. PHP提供了一些内置函数&#xff0c;这些函数用于验…

Linux 平台下 MySQL 5.5 安装 说明 与 示例

一.下载说明前期的一些准备说明&#xff0c;参考&#xff1a;MySQL 发展史http://blog.csdn.net/tianlesoftware/article/details/6999245Mysql 不同版本 说明http://blog.csdn.net/tianlesoftware/article/details/6723117 MySQL 分为Community Server 和 Enterprise Edition。…

开始python之旅

接触python缘于工作所需&#xff0c;曾经接触过C、C等语言&#xff0c;对于编程语言在学习上大体是一个套路&#xff0c;当然套路因人而异&#xff0c;适合就好。接下来&#xff0c;我将不断分享python的知识和学习技巧&#xff0c;共同学习。 起源 初识一门语言善于先了解语言…

LeetCode 112. 路径总和 、113. 路径总和 II 思考分析

目录112. 路径总和题目递归解递归解&#xff0c;其他人的解法迭代解&#xff0c;其他人的解法113. 路径总和 II题目递归解递归解&#xff0c;参考别人的思路112. 路径总和 题目 给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;…

kotlin 查找id_Kotlin程序查找矩阵的转置

kotlin 查找idA transpose of a matrix is simply a flipped version of the original matrix. We can transpose a matrix by switching its rows with its columns 矩阵的转置只是原始矩阵的翻转形式。 我们可以通过切换矩阵的行和列来转置矩阵 Given a matrix, we have to…

[mongodb翻译]分片和故障转移

一个配置恰当的mongodb 分片集群不会有单点失效。 本章节描述了集群服务器中可能出现的故障&#xff0c;及相应的对策。 1. 某个mongos路由进程故障 每一个mongos会运行每一台应用服务器上面&#xff0c;该应用服务器只能通过这个mongos进程和集群进行通信。mongos进程不是…

看张子阳的书真是收获很多,也醒悟了很多(一)

摘录&#xff1a; 这是有一次开会时&#xff0c;我的老总跟我们说了这样一个事例&#xff1a;通常来说&#xff0c;医生是很高尚的职业&#xff08;暂不考虑国内医生的负面新闻&#xff09;&#xff0c;尤其是牙科医生&#xff0c; 他们有着体面的工作并且收入不菲。但是&#…

【C++ grammar】抽象、封装与this指针

目录1、Abstraction and Encapsulation&#xff08;抽象与封装&#xff09;1. Data Field Encapsulation (数据域封装)2. Accessor and Mutator (访问器与更改器)2.1. To read/write private data, we need get/set function (为读写私有数据&#xff0c;需要get/set函数)2.2. …

java创建临时文件_用Java创建一个临时文件

java创建临时文件The task is to create a temporary file in Java. 任务是用Java创建一个临时文件。 Creating a temporary file 创建一个临时文件 To create a temporary file in java – we use createTempFile() method of "File" class. The createTempFile()…

十九、图像的形态学操作

一、图像形态学 图像形态学是图像处理学科的一个单独分支学科 主要针对的是灰度图和二值图像 是由数学的集合论以及数学中的拓扑几何原理发展而来 二、膨胀操作&#xff08;dilate&#xff09; 33的卷积核 以33为卷积核从左往右(从上往下)开始运行&#xff0c;若这卷积核…

X名称空间(WPF)

笔记简述 闲话x名称空间简要x名称空间的Attributex名称空间的标签扩展x名称空间的XAML指令元素闲话 本笔记参考与《深入浅出WPF》、MSDN、Some Blog… MSDN的飞机票点这里。 x名称空间简要 在VS中新建个WpfApplication都会自动生成xmlns:x"http://schemas.microsoft.com/w…

基于Bresenham和DDA算法画线段

直线&#xff1a;ykxb 为了将他在显示屏上显示出来&#xff0c;我们需要为相应的点赋值&#xff0c;那么考虑到计算机的乘法执行效率&#xff0c;我们肯定不会选择用Ykxb这个表达式求值&#xff0c;然后进行画线段。 我们应当是将它转化为加法运算。 下面提供两种常见的算法&am…