OpenCv形态学(一)

目录

形态学转换

结构元素

腐蚀

膨胀

开运算

闭运算

形态学梯度

顶帽

黑帽

图像轮廓

查找轮廓

绘制轮廓


形态学转换

·形态变换是一些基于图像形状的简单操作。通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性质的结构元素或内核。两种基本的形态学算子是侵蚀和膨胀。然后,它的变体形式(如“打开”,“关闭”等)也开始起作用。形态变换是一些基于图像形状的简单操作。通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性质的结构元素或内核。两种基本的形态学算子是侵蚀和膨胀。然后,它的变体形式(如“打开”,“关闭”等)也开始起作用。基本思想:使用具有一定形状的结构元素去度量和提取图像中对应的形状,以达到对图像进行处理的目的。

形态学操作图像的数学基础是集合论

集合的交集和并集

集合的补集和差集

集合的反射

集合的平移

结构元素

二值图像形态学处理的运算对象是集合

设A为像素集合,B为结构元素(本身也是一个像素集合,其元素是感兴趣目标的像素),处理过程就是用B对A进行操作。结构元素B对A的具体操作

  • 通过让B在A上平移,以便B的原点访问A的每一个元素,以此得到一个新的像素集合

    结构元素必须指定一个原点

  • 结构元素的原点就是形态学运算的参考点(当结果元素对称且未显示原点时,通常将原点假定在对称中心处)

    当对图像操作时,要求结构元素时矩形阵列(通过添加最小可能数量的背景元素组成一个矩阵阵列来实现)

    注意:形态学处理中,只考虑图像和结构元素中有效像素点,也就是只考虑感兴趣的前景部分,背景部分不予考虑

    为什么结构元素是奇数:

    旋转180°不变,反射之后还是他本身

    原点方便定位中心点

cv2.getStructuringElement(shape, ksize, anchor)

函数用于返回一个指定形状和尺寸的结构元素,该结构元素可用于形态学操作,如腐蚀、膨胀、开运算和闭运算等。其语法参数说明:

  • shape:表示结构元素的形状,可以是以下几种取值:

  • cv2.MORPH_RECT:矩形结构元素

  • cv2.MORPH_CROSS:十字形结构元素

  • cv2.MORPH_ELLIPSE:椭圆形结构元素

  • ksize:表示结构元素的大小

  • anchor:表示结构元素的锚点位置,默认为(-1,-1),表示结构元素的中心

在图像处理中,使用cv2.getStructuringElement函数创建结构元素时,将ksize参数设置为奇数有以下几个原因:

  • 对称性:奇数尺寸的结构元素具有对称性,这在一些形态学操作中是很重要的。例如,在腐蚀和膨胀操作中,使用对称的结构元素可以确保操作的结果在图像的不同位置上具有相似的效果。

  • 中心性:奇数尺寸的结构元素有一个明确的中心像素。这个中心像素在形态学操作中起着重要的作用,例如在腐蚀操作中

  1. 边界处理的便利性:在处理图像边界时,奇数尺寸的结构元素可以更方便地处理边界像素。对于奇数尺寸,能够以更对称和一致的方式处理靠近图像边缘的部分,减少边界效应带来的不一致性。

  2. 更好的局部特征提取:在一些应用中,奇数尺寸的结构元素可以更准确地捕捉图像的局部特征。这是因为其中心像素能够更精确地定位在目标区域内,从而对局部结构的描述更加准确。

  3. 数学计算的简洁性:在某些形态学运算的数学实现中,奇数尺寸的结构元素可能会使计算更加简洁和高效,减少计算过程中的复杂性和可能出现的错误。

腐蚀

.Common Names: Erode, Shrink, Reduce(常用名称:腐蚀,侵蚀,收缩,减少)。侵蚀是数学形态学领域的两个基本算子之一,另一个是膨胀算子。

·侵蚀通常适用于二值图像,但也有适用于灰度图像的版本。算子对二值图像的基本作用是侵蚀掉前景像素(即白色像素)区域的边界。因此,前景像素的区域缩小了。

效果:缩小图像中的物体

定义:假设A是原始的二值图像,B是结构元素,则A被B腐蚀的定义为:将结构元素B相对于集合A进行平移,只要平移后结构元素都包含在集合A中,则这些位移Z的点(前景像素点)的集合即为腐蚀后的结果

def erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):

  • src:输入图像,可以是多通道图像,深度应为CV_8UCV_16UCV_16SCV_32FCV_64F之一。

  • dst:输出与输入图像相同大小和类型的图像。

  • kernel:用于腐蚀的结构元素。如果kernel=Mat(),则使用3x3矩形结构元素。可以使用getStructuringElement()函数创建内核。

  • anchor:锚点在元素内的位置,默认值为(-1,-1),表示锚点位于元素中心。

  • iterations:腐蚀的次数,默认值为1。

  • borderType:像素外推方法,可选项包括BORDER_CONSTANTBORDER_REPLICATE等。

  • borderValue:边界不变的边界值。

腐蚀的过程

 eg:去掉两个物体之间连接的细线

im=np.zeros((200,200),np.uint8)
im[20:23,20:23]=255

# 获取一个3*3的结构元素
# 第一个参数:结果元素的形状,矩阵还是十字型
# 第二个参数:结构元素的大小
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
dst=cv2.erode(im,kernel)
cv2.imshow("im",im)
cv2.imshow("dst",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

用3*3的卷积核腐蚀3*3的矩阵(原图--右,效果图--左)

膨胀

·效果:扩大图像中的物体,在二值图中扩大白色的部分,收缩黑色的部分

·定义:假设A是原始的二值图像,B是结构元素,则A被B膨胀的定义为:

又被定义为:

也就是,A被B膨胀的结果是满足上面公式的所有位移z的点(前景像素点)的集合。

dilation = cv.dilate(img,kernel,iterations =1)

  • img:要进行膨胀操作的输入图像。

  • kernel:用于膨胀操作的结构元素,通常通过 cv2.getStructuringElement 函数获取。

  • iterations:膨胀操作的迭代次数。默认值为 1,表示执行一次膨胀操作。如果设置为大于 1 的值,则会连续执行指定次数的膨胀操作,使得膨胀效果更加强烈。

开运算

效果: 断开较窄的粘连线,消除较细的突出物和噪音,使图像的轮廓变得光滑(去除白点)

定义: 假设A是原始的二值图像,B是结构元素,则A被B开运算的定义为:

也就是,先用B对A继续腐蚀,然后再用B对腐蚀的结果进行膨胀

opening = cv2.morphologyEx(img, cv.MORPH_OPEN, kernel)

 

闭运算

效果:关闭前景对象内部的小孔或对象上的小黑点时很有用。使图像的

轮廓变得光滑(去除黑点)

定义:假设A是原始的二值图像,B是结构元素,则A被B闭运算的定义

为:   先用B对A继续膨胀,然后再用B对膨胀的结果进行腐蚀

closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)

形态学梯度

效果:

图像边界提取

·定义:假设A是原始的二值图像,B是结构元素,则定义为:

也就是,腐蚀的部分

·gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)

示例:获取图像边界

import cv2
im = cv2.imread("grad.png")
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
im2 = cv2.morphologyEx(im, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("im", im)
cv2.imshow("gradient", im2)
# cv2.imshow("im3", im3)
cv2.waitKey(0)
cv2.destroyAllWindows()

顶帽

顶帽是输入图像和图像开运算之差

  • tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)

    细小结构。因此,顶帽运算能够突出原始图像中比周围环境更亮的区域

    或者斑点,有助于分离出这些亮区域,比如寻找图像中的亮点物体或者

    高亮细节。这对于背景相对均匀而前景目标较亮的图像特别有用,例如,

    在医学成像或文本识别中强调局部高亮区域。(找小白点)

  • ·开运算由先腐蚀后膨胀组成,能够去除图像中的小亮点(比如噪声)

黑帽

     是输入图像和图像闭运算之差

  • blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT,kernel)

    闭运算由先膨胀后腐蚀组成,能够填充图像中的小暗点和细小缝隙。因此,黑帽运算能突出显示原始图像中比周围环境更暗的区域或者斑块,有助于发现图像中的暗区域或者阴影部分,对于背景去除或者凸显图像中的暗结构非常有效。在一些应用场景下,如检测路面坑洞或寻找图像中的暗色目标时非常有用。

图像轮廓

图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物

体的检测和识别中很有用。

·轮廓的作用:

    -图形分析

     -物体的检测和识别

.注意点:

函数返回两个值:轮廓列表 contours 和轮廓的层次结构 hierarchy

.Mode查找轮廓的模式:

RETR EXTERNAL=0这是最简单的检索模式,只检索最外层的轮廓,即不包括任何嵌套轮廓。如果你只关心物体的外部边界,而不考虑其内部结构或孔洞,这个模式就很适用。

RETR LIST=1该模式检索所有轮廓,并将其作为列表返回,但不创建任何层次结构。每个轮廓都是独立的,没有父子关系信息。适用于需要所有轮廓但不需要它们之间关系的场景。

RETR CCOMP =2在这种模式下,检索到的轮廓被组织成两层层次结构。顶层是外部边界,第二层是孔和内部边界。如果一个对象内有多个孔,则孔被视为同一层级。这对于需要区分外边界和内部孔洞的场景很有用。

RETR_TREE =3这是最复杂的检索模式,构建了一个完整的轮廓层次树。每个轮廓都有一个层次信息,可以区分出父轮廓和子轮廓(内部轮廓),非常适合于需要分析复杂结构和多级嵌套轮廓的场景。(常用这个)

  • 需要先对图像进行二值化处理

  • 画轮廓会修改原始图像,如果后面像继续使用原始图像,应该设置原始图像副本

  • 查找轮廓

    findContours(image, mode, method[, contours[,hierarchy[ offset]]]) -> contours, hierarchy

    图片只能是单通道u8的

    cv2.findContours 函数用于在二值图像中查找轮廓,其参数如下:

  • image:输入的 8 位单通道图像,可以是二值图像。

  • mode:轮廓的检索模式,常见的取值有:

  • cv2.RETR_EXTERNAL:只检测最外层轮廓。

  • cv2.RETR_LIST:检测所有轮廓,不建立层次关系。

  • cv2.RETR_CCOMP:检测所有轮廓,并将其组织为两层的层次结构。

  • cv2.RETR_TREE:检测所有轮廓,并重建完整的层次结构。

  • method:轮廓的近似方法,常见的取值有:

  • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。

  • cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,只保留其端点。

  • 函数返回两个值:轮廓列表 contours 和轮廓的层次结构 hierarchy

    .Mode查找轮廓的模式:

    RETR EXTERNAL=0这是最简单的检索模式,只检索最外层的轮廓,即不包括任何嵌套轮廓。如果你只关心物体的外部边界,而不考虑其内部结构或孔洞,这个模式就很适用。

    RETR LIST=1该模式检索所有轮廓,并将其作为列表返回,但不创建任何层次结构。每个轮廓都是独立的,没有父子关系信息。适用于需要所有轮廓但不需要它们之间关系的场景。

    RETR CCOMP =2在这种模式下,检索到的轮廓被组织成两层层次结构。顶层是外部边界,第二层是孔和内部边界。如果一个对象内有多个孔,则孔被视为同一层级。这对于需要区分外边界和内部孔洞的场景很有用。

    RETR_TREE =3这是最复杂的检索模式,构建了一个完整的轮廓层次树。每个轮廓都有一个层次信息,可以区分出父轮廓和子轮廓(内部轮廓),非常适合于需要分析复杂结构和多级嵌套轮廓的场景。(常用这个)

    findContours(image, mode, method[, contours[,hierarchy[,offset]]]) -> contours(轮廓), hierarchy(层级)

    ·Method:

  • CHAIN APPROX NONE=1:轮廓中的每一点都会被精确保存下来

  • CHAIN APPROX SIMPLE = 2: 仅保留轮廓的端点和具有拐角的点来简化轮廓表示

绘制轮廓

drawContours(image, contours, contourldx, color[, thickness[,lineType[,hierarchy[,maxLevel[, offset]]]]]) -> image

  • Image 要绘制的轮廓图像

  • Contours 轮廓点

  • contourldx 要绘制的轮廓编号,-1表示绘制所有轮廓,0是最外层,1是内层

    :Color: 轮廓的颜色

  • Thickness:线宽,-1表示填充

代码示例:绘制左图中的所有边框轮廓

import cv2

im = cv2.imread("p1.png")
im_orgin = im.copy()
im1 = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

# 查找轮廓
contours, _ = cv2.findContours(im1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓

cv2.drawContours(im, contours, -1, (0, 0, 255), 2, cv2.LINE_AA)
cv2.imshow("im_orgin", im_orgin)
cv2.imshow("im", im)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐系统(LLM去偏?) | (WSDM24)预训练推荐系统:因果去偏视角

::: 大家好!今天我分享的文章是来自威斯康星大学麦迪逊分校和亚马逊AWS AI实验室的最新工作,文章所属领域是推荐系统和因果推理,作者针对跨域推荐中的偏差问题提出了一种基于因果去偏的预训练推荐系统框架PreRec。 ::: 原文:Pre-t…

2024年敏捷开发管理工具10大精选

国内外主流的十大敏捷开发管理系统:PingCode、Tapd、OpenProject、Jira、ClickUp、Monday.com、Wrike、Taiga、Tuleap、Redmine。 敏捷开发已成为软件开发领域的一种标准实践,有效的管理工具是其成功实施的关键。本文将探讨在2024年,哪些敏捷…

迁移学习——CycleGAN

CycleGAN 1.导入需要的包2.数据加载(1)to_img 函数(2)数据加载(3)图像转换 3.随机读取图像进行预处理(1)函数参数(2)数据路径(3)读取文…

基于redisson实现tomcat集群session共享

目录 1、环境 2、修改server.xml 3、修改context.xml 4、新增redisson配置文件 5、下载并复制2个Jar包到Tomcat Lib目录中 6、 安装redis 7、配置nginx负载均衡 8、配置测试页面 9、session共享测试验证 前言: 上篇中,Tomcat session复制及ses…

观测云 VS 开源自建

观测云是一款面向全技术栈的监控观测一体化产品方案,具备强大而丰富的功能,目标是帮助最终用户提升监控观测的能力,化繁为简,轻松的构建起完整的监控观测体系。同时能够帮助整个企业的开发技术团队从统一的观测能力上获得完整的收…

ONLYOFFICE 文档开发者版 8.1:API 更新

随着版本 8.1 新功能的发布,我们更新了编辑器、文档生成器和插件的 API,并添加了 Office API 板块。阅读下文了解详情。 ​ ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器,支持处理文本文档、电子表格、演示文稿、可填写…

探索ChatGPT在程序员日常工作的多种应用

引言 在现代科技迅猛发展的今天,人工智能的应用已经深入到我们生活和工作的各个方面。作为程序员,我们时常面临大量繁杂的任务,从代码编写、错误调试到项目管理和团队协作,每一项都需要花费大量的时间和精力。近年来,…

算法与数据结构——时间复杂度详解与示例(C#,C++)

文章目录 1. 算法与数据结构概述2. 时间复杂度基本概念3. 时间复杂度分析方法4. 不同数据结构的时间复杂度示例5. 如何通过算法优化来提高时间复杂度6. C#中的时间复杂度示例7. 总结 算法与数据结构是计算机科学的核心,它们共同决定了程序的性能和效率。在实际开发中…

大模型产品的“命名经济学”:名字越简单,产品越火爆?

文 | 智能相对论 作者 | 陈泊丞 古人云:赐子千金,不如教子一艺;教子一艺,不如赐子一名。 命名之妙,玄之又玄。 早两年,大模型爆火,本土厂商在大模型产品命名上可谓下足了功夫,引…

C#+uni-app医院HIS预约挂号系统源码 看病挂号快人一步

​​​​​​​ 提到去大型医院机构就诊时,许多人都感到恐惧。有些人一旦走进医院的门诊大厅,就感到迷茫,既无法理解导医台医生的建议,也找不到应该去哪个科室进行检查。实际上,就医也是一门学问,如何优化…

【CS.DS】数据结构 —— 图:深入了解三种表示方法之邻接表(Adjacency List)

文章目录 1 概念2 无向图的邻接表2.1 示例2.2 Mermaid 图示例2.3 C实现2.3.1 简单实现2.3.2 优化封装 2.4 总结 3 有向图的邻接表3.1 示例3.2 C实现3.3 总结 4 邻接图的遍历5 拓展补充References 数据结构 1 概念 优点:空间效率高,适合稀疏图。动态性强…

Win10,Win11电脑重装系统怎么操作,简单一步搞定【保姆级教程】

电脑重装系统怎么操作?电脑使用时间长了,就会出现系统崩溃、病毒感染或者是系统文件损坏等问题。这个时候我们就可以对电脑进行系统重装,也就是恢复电脑出厂设置。现在市面上有很多系统重装工具可以帮助我们解决难题,如果您是电脑…

自定义 Django 管理界面中的多对多内联模型

1. 问题背景 在 Django 管理界面中,用户可以使用内联模型来管理一对多的关系。但是,当一对多关系是多对多时,Django 提供的默认内联模型可能并不适合。例如,如果存在一个产品模型和一个发票模型,并且产品和发票之间是…

Java文件操作小项目-带GUI界面统计文件夹内文件类型及大小

引言 在Java编程中,文件操作是一项基本且常见的任务。我们经常需要处理文件和文件夹,例如读取、写入、删除文件,或者遍历文件夹中的文件等。本文将介绍如何使用Java的File类和相关API来统计一个文件夹中不同类型文件的数量和大小。 准备工作…

数据分析python基础实战分析

数据分析python基础实战分析 安装python,建议安装Anaconda 【Anaconda下载链接】https://repo.anaconda.com/archive/ 记得勾选上这个框框 安装完后,然后把这两个框框给取消掉再点完成 在电脑搜索框输入"Jupyter",牛马启动&am…

Vitis Accelerated Libraries 学习笔记--OpenCV 安装指南

目录 1. 简介 2. 安装过程 2.1 安装准备 2.2 编译并安装 XRT 2.2.1 下载 XRT 源码 2.2.2 安装依赖项 2.2.3 构建 XRT 2.2.4 打包 DEB 2.2.5 安装 XRT 2.3 编译并安装 OpenCV 2.3.1 下载 OpenCV 源码 2.3.2 创建目录 2.3.3 设置环境变量 2.3.4 构建 opencv 3. 总…

【STM32】看门狗

1.看门狗简介 看门狗起始就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新恢复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的简单一点,看门狗…

加速业务布局,30年老将加盟ATFX,掌舵运营新篇章

全球领先的差价合约经纪商ATFX日前宣布了一项重大人事任命,聘请业界资深人士约翰博格(John Bogue)为机构业务运营总监。约翰博格是一名行业老将,曾在差价合约界深耕三十余载。伴随其加入ATFX,相信他的深厚专业知识和从业经验将为ATFX机构业务…

HarmonyOS NEXT Developer Beta1配套相关说明

一、版本概述 2024华为开发者大会,HarmonyOS NEXT终于在万千开发者的期待下从幕后走向台前。 HarmonyOS NEXT采用全新升级的系统架构,贯穿HarmonyOS全场景体验的底层优化,系统更流畅,隐私安全能力更强大,将给您带来更高…

数据集的未来:如何利用亮数据浏览器提升数据采集效率

目录 一、跨境电商的瓶颈1、技术门槛2、语言与文化差异3、网络稳定性4、验证码处理和自动识别5、数据安全6、法规和合规 二、跨境电商现在是一个合适的商机吗?三、数据集与亮数据浏览器1、市场分析2、价格监控3、产品开发4、供应链优化5、客户分析 四、亮数据浏览器…