05- 形态学及图像的开闭运算 (OpenCV基础) (机器视觉)

news2025/1/23 4:59:21

知识重点

  • 二值化操作  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),对灰度图像操作,  全局阈值,整幅图像采用同一个数作为阈值
  • 自适应阈值二值化  dst = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 7)  此时的阈值是根据图像上的每一个小区域计算与其对应的阈值

  • 腐蚀操作  dst = cv2.erode(img, kernel, iterations = 2)  腐蚀操作也是用卷积核扫描图像, 去除图片中的噪点, 只不过腐蚀操作的卷积和一般都是1, 如果卷积核内所有像素点都是白色, 那么锚点即为白色. iterations是腐蚀操作的迭代次数, 次数越多, 腐蚀效果越明显 。
    • getStructuringElement(shape, ksize[, anchor])  opencv提供了获取卷积核的api.不需要我们手工创建卷积核.shape是指卷积核的形状, 注意不是指长宽, 是指卷积核中1形成的形状.

  • 膨胀操作  dst = cv2.dilate(img, kernel, iterations = 1)  实现对图像的膨胀操作
  • 开运算  dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)  开运算 = 腐蚀 + 膨胀  去除图像外部的噪点 .
  • 闭运算  dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)  闭运算 = 膨胀 + 腐蚀  填充图像内部的噪点 .
  • 形态学梯度  dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)  梯度 = 原图 - 腐蚀, 腐蚀之后原图边缘变小了, 原图 - 腐蚀 就可以得到腐蚀掉的部分, 即边缘.
  • 顶帽运算  dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel,iterations = 2)  顶帽 = 原图 - 开运算  开运算的效果是去除图像外的噪点, 原图 - 开运算就得到了去掉的噪点.
  • 黑帽操作  dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel,iterations = 2) 
    • 黑帽 = 原图 - 闭运算  闭运算可以将图形内部的噪点去掉, 那么原图 - 闭运算的结果就是图形内部的噪点.


6. 形态学

6.1 形态学概述

什么是形态学

  • 指一系列处理图像形状特征的图像处理技术

  • 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。

  • 这些处理方法基本是对二进制图像进行处理, 即黑白图像

  • 卷积核决定着图像处理后的效果

  • 形态学常用基本操作有:

    • 膨胀和腐蚀

    • 开运算

    • 闭运算

    • 顶帽

    • 黑帽

6.2 图像全局二值化

  • 二值化: 将图像的每个像素变成两种值, 比如0, 255.

  • threshold(src, thresh, maxval, type[, dst])

    • src 最好是灰度图

    • thresh: 阈值

    • maxval: 最大值, 最大值不一定是255

    • type: 操作类型. 常见操作类型如下:

# 常见如黑白图 
import cv2
import numpy as np

img = cv2.imread('./dog.jpeg')
# 二值化操作,对灰度图像操作
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 返回两个值,一个是阈值,一个是二值化处理后的图片
thresh, dst = cv2.threshold(gray, 90, 255, cv2.THRESH_BINARY)

cv2.imshow('dog', np.hstack((gray, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

6.3 自适应阈值二值化

在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。

  • adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
  • 这种方法需要我们指定六个参数,返回值只有一个。
    • Adaptive Method - 指定计算阈值的方法。
      • cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
      • cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
    • Block Size - 邻域大小(用来计算阈值的区域大小)。
    • C - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。
import cv2
import numpy as np

img = cv2.imread('./dog.jpeg')
# 二值化操作,对灰度图像操作
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 自适应阈值二值化只有一个返回值
dst = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                            cv2.THRESH_BINARY, 9, 7)

# 展示
cv2.imshow('dog', np.hstack((gray, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

6.4 腐蚀操作

  • 腐蚀操作也是用卷积核扫描图像, 只不过腐蚀操作的卷积和一般都是1, 如果卷积核内所有像素点都是白色, 那么锚点即为白色.

  • 大部分时候腐蚀操作使用的都是全为1的卷积核.

  • erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

    • iterations是腐蚀操作的迭代次数, 次数越多, 腐蚀操作执行的次数越多, 腐蚀效果越明显.

import cv2
import numpy as np

# 导入图片
img = cv2.imread('./msb.png')
# 定义核
kernel = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, kernel, iterations = 2)

cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

6.5 获取形态学卷积核

  • opencv提供了获取卷积核的api.不需要我们手工创建卷积核.

  • getStructuringElement(shape, ksize[, anchor])

    • shape是指卷积核的形状, 注意不是指长宽, 是指卷积核中1形成的形状.

      • MORPH_RECT 卷积核中的1是矩形, 常用.

      • MORPH_ELLIPSE 椭圆

      • MORPH_CROSS 十字

import cv2
import numpy as np

img = cv2.imread('./j.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))  # 卷积核
print(kernel)
# 腐蚀
dst = cv2.erode(img, kernel)  

cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

6.6 膨胀操作

膨胀是腐蚀的相反操作, 基本原理是只要保证卷积核的锚点是非0值, 周边无论是0还是非0值, 都变成非0值.

  • dilate(img, kernel, iterations=1)
  • 膨胀, 使用原图轮廓增加
import cv2
import numpy as np

img = cv2.imread('./msb.png')
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))
print(kernel)
dst = cv2.dilate(img, kernel, iterations = 1)

cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

6.7 开运算

  • 开运算和闭运算都是腐蚀和膨胀的基本应用.

  • 开运算 = 腐蚀 + 膨胀

  • morphologyEx(img, MORPH_OPEN, kernel)

    • MORPH_OPEN 表示形态学的开运算

    • kernel 如果噪点比较多, 会选择大一点的kernel, 如果噪点比较小, 可以选择小点的kernel

# 开运算
import cv2
import numpy as np

# 开运算 = 腐蚀 + 膨胀 去噪声
img = cv2.imread('./dotj.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))
# 调用OpenCV 提供的 api
dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('img', np.hstack((img ,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

6.8 闭运算

  • 闭运算 = 膨胀 + 腐蚀

  • 填充图像内部的噪点 .

import cv2
import numpy as np

img = cv2.imread('./dotinj.png')
# 闭运算
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))
# 调用OpenCV 提供的 api
dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('img', np.hstack((img ,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

6.9 形态学梯度

  • 梯度 = 原图 - 腐蚀

  • 腐蚀之后原图边缘变小了, 原图 - 腐蚀 就可以得到腐蚀掉的部分, 即边缘.

import cv2
import numpy as np

img = cv2.imread('./msb.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,2))
# 调用OpenCV 提供的 api
dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('img', np.hstack((img ,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

6.10 顶帽运算

  • 顶帽 = 原图 - 开运算

  • 开运算的效果是去除图像外的噪点, 原图 - 开运算就得到了去掉的噪点.

# 留下噪声
import cv2
import numpy as np

img = cv2.imread('./dotj.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
# 调用OpenCV 提供的 api
dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel,iterations = 2)

cv2.imshow('img', np.hstack((img ,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 右图为顶帽操作结果 .

6.11 黑帽操作

  • 黑帽 = 原图 - 闭运算

  • 闭运算可以将图形内部的噪点去掉, 那么原图 - 闭运算的结果就是图形内部的噪点.

# 留下图形内部的噪点
import cv2
import numpy as np

img = cv2.imread('./dotinj.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
# 调用OpenCV 提供的 api
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel,iterations = 2)

cv2.imshow('img', np.hstack((img ,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

做测试5年,靠业务熟悉吃老本,技术短板暴露,30岁被无情辞退...

朋友跟我诉苦,最近他被公司无情辞退了。测试几年,月薪10k,如今已经30了,接下来不知道该怎么办,让我帮他想想办法... 几年下来,也算是公司的骨干成员,不说有功,但一定无过。公司业务…

乐山持点科技:抖音38好物节活动运营要求

抖音38好物节活动马上就要到了,很多人都还不知道抖音38好物节活动的运营要求,乐山持点科技小编这就来给各位抖音达人们分享。5.1 商家活动管控规范5.1.1 以上条件为满足参加活动的基本条件,最终是否能够参加活动,以平台的最终审核…

kubernetes入门介绍,从0到1搭建并使用

Kubernetes是一个容器编排系统,用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识,包括基本概念、安装部署和基础用法。 基础介绍 Kubernetes是Google开发的开源项目,是一个容器编排系统,可以自动化部署、…

【100个 Unity实用技能】☀️ | C#泛型集合常用方法,查找符合要求的第一个元素并返回

Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

学数据结构第一个是学链表?不,是它

大家好,我是五月。前言以前很多小白都来询问过关于数据结构的内容,问题基本都是想学链表,堆栈、队列、树这些该怎么下手。一方面我表示赞许,另一方面又觉得他们对数据结构这个东西真是知之甚少。我告诉他们,第一个要学…

常用Linux的ssh远程终端连接工具

putty 说明 putty是最简单的SSH工具,无需安装,支持多系统版本,下载后就可以直接使用。 优点: 1.免费 2.免安装 缺点: 1、不支持标签模式; 2、默认设置不友好,很多功能都需要额外配置才行&…

Vue Slot (四种方式:超详细)

slot(插槽)的概念是把外层的内容塞进子元件的指定位置里。跟插槽的字面意思一样,前提是:有插口才能插。子元件需要开一个插口(slot),才可以在外层元件把内容塞进子元件里。 slot(插槽) 可分为四种: slot(插槽)Named slot(具名插槽)Scoped slot(作用域插槽)Dyn…

掌握MySQL分库分表(七)广播表、绑定表实战,水平分库+分表实现及之后的查询和删除操作

文章目录什么是广播表广播表实战数据库配置表Java配置实体类配置文件测试广播表水平分库分表配置文件运行测试什么是绑定表?绑定表实战配置数据库配置Java实体类配置文件运行测试水平分库分表后的查询和删除操作查询操作什么是广播表 指所有的分片数据源中都存在的…

redis(win版)

1. 前言1.1 什么是RedisRedis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。基于内存存储,读写性能高适合存储热点数据&am…

SealOS 一键安装 K8S

环境 # 查看系统发行版 $ cat /etc/os-release NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLOR"0;31" CPE_NA…

黑马 Vue 快速入门 笔记

黑马 Vue 快速入门 笔记0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 七大属性0.5 el:挂载点1 VUE基础1.0 第一个vue代码:Hello,vue1.1 v-bind 设置元素的属性 简写 :1.2 v-if , v-else , v-else-ifv-if , v-e…

【Npde.js】express以及nodemon

express初始Express什么是Express不使用Express可以创建web服务器吗?Express能做什么安装Express监听GET请求和post请求获取URL中携带的查询参数获取URL中携带的动态参数托管静态资源nodemon为什么使用nodemon初始Express 什么是Express 官方给出的概念&#xff0…

ctf pwn基础-1

在心中做了无数次决定,我终于还是准备学pwn了,为了继承学长的衣钵,更别说自己已经下定决心学习 c了,废话不多说下面正式开始。 目录 基础 实列讲解 基础 很多人一上来就叫你什么汇编啊、c啊什么的,让人往而却步&…

分布式任务调度处理方案(无代码)

业务涉及到,需要向数据库、redis、elasticsearch、MinIO写四份数据,这里存在分布式事务问题。如何解决问题,先分析cap,是要保证可用性,还是保证一致性。如何选择是CP还是AP?分析业务场景CP的场景&#xff1…

canvas样式与颜色,字体,图片,状态,形变

色彩 fillStyle color 设置图形的填充颜色。 strokeStyle color 设置图形轮廓的颜色。 备注: 一旦您设置了 strokeStyle 或者 fillStyle 的值,那么这个新值就会成为新绘制的图形的默认值。如果你要给每个图形上不同的颜色,你需要重新设置…

Java Scanner 类,超详细整理,适合新手入门

目录 一、什么是 Java Scanner 类? 二、引用数据类型 1、引用数据类型的定义 三、Scanner 类有哪些常用方法? hasNext()用法 四、next() 与 nextLine() 区别 next(): nextLine(): 五、使用 next 方法 五、使用 nextLine方法 一、什…

SkyWalking仪表盘使用

Skywalking仪表盘使用 1 仪表盘 作用:查看被监控服务的运行状态。 1)监控面板 1.1 APM APM:应用性能管理,通过各种探针采集数据,收集关键指标,同时搭配数据呈现以实现对应用程序性能管理和故障管理的系统化解决方案…

机器学习主要内容的思维导图

机器学习 机器学习: 定义:能够从经验中学习从而能够 把事情不断做好的计算机程序 人工智能的一个分支和 实现方式 理论基础:概率论 数理统计 线性代数 数学分析 数值逼近 最优化理论 计算复杂理论 核心要素:数据 算法 模型 机器…

【极海APM32替代笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时

【极海APM32替代笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时 外部定时器 采用定时器做延时使用时 需要计算好分频和计数 另外还要配置为不进行自动重载 对于50MHz的工作频率 分频为50-1也就是50M/501M 一次计数为1us 分频为50000-1也就是1k 一次计数为1ms 我配置的是…

论文解读 | [AAAI2020] 你所需要的是边界:走向任意形状的文本定位

目录 1、研究背景 2、研究的目的 3、方法论 3.1 Boundary Point Detection Network(BPDN) 3.2 Recognition Network 3.3 Loss Functions 4、实验及结果 论文连接:https://ojs.aaai.org/index.php/AAAI/article/view/6896 1、研究背景 最近,旨在…