opencv形态学操作

2023-11-17

连通性

        在图像中,最⼩的单位是像素,每个像素周围有8个邻接像素,常⻅的邻接关系有3 种:4邻接、8邻接和D邻接。分别如下图所示:

        4邻接:像素p(x,y)的4邻域是:(x+1,y);(x-1,y);(x,y+1);(x,y-1),⽤N (p)表示像素p的4邻接 D邻接

        像素p(x,y)的D邻域是:对⻆上的点 (x+1,y+1);(x+1,y-1);(x1,y+1);(x-1,y-1),⽤N (p)表示像素p的D邻域

        8邻接:像素p(x,y)的8邻域是: 4邻域的点 + D邻域的点,⽤N (p)表示像素p 的8邻域

连通性是描述区域和边界的重要概念,两个像素连通的两个必要条件是:

        1. 两个像素的位置是否相邻

        2. 两个像素的灰度值是否满⾜特定的相 似性准则(或者是否相等 根据连通性的定义,有4联通、8联通和m联通三种。

                4联通:对于具有值V 的像素p和q,如果q在集合N (p)中,则称这两个像素是4 连通。

                8联通:对于具有值V 的像素p和q,如果q在集 合N (p)中,则称这两个像素是8 连通。

          对于具有值V 的像素p和q,如果: q在集合N (p)中,或 q在集合N (p)中,并且N (p)与N (q)的交集为空(没有值V 的像素) 则称这两个像素是m连通的,即4连通和D连通的混合连通。

 形态学操作

        形态学转换是基于图像形状的⼀些简单操作。它通常在⼆进制图像上执⾏。腐蚀和 膨胀是两个基本的形态学运算符。然后它的变体形式如开运算,闭运算,礼帽⿊帽 等。

腐蚀和膨胀

        腐蚀和膨胀是最基本的形态学操作,腐蚀和膨胀都是针对⽩⾊部分(⾼亮部分)⽽⾔的。

                膨胀就是使图像中⾼亮部分扩张,效果图拥有⽐原图更⼤的⾼亮区域;腐蚀是原图 中的⾼亮区域被蚕⻝,效果图拥有⽐原图更⼩的⾼亮区域。膨胀是求局部最⼤值的 操作,腐蚀是求局部最⼩值的操作。

        1. 腐蚀具体操作是:⽤⼀个结构元素扫描图像中的每⼀个像素,⽤结构元素中的每⼀ 个像素与其覆盖的像素做“与”操作,如果都为1,则该像素为1,否则为0。如 下图所示,结构A被结构B腐蚀后:

        腐蚀的作⽤是消除物体边界点,使⽬标缩⼩,可以消除⼩于结构元素的噪声点。

cv.erode(img,kernel,iterations)

参数:

        img: 要处理的图像

        kernel: 核结构

        iterations: 腐蚀的次数,默认是1

        1. 膨胀具体操作是:⽤⼀个结构元素扫描图像中的每⼀个像素,⽤结构元素中的每⼀个像 素与其覆盖的像素做“与”操作,如果都为0,则该像素为0,否则为1。如下图所 示,结构A被结构B腐蚀后:

         

        膨胀的作⽤是将与物体接触的所有背景点合并到物体中,使⽬标增⼤,可添补⽬标 中的孔洞。

cv.dilate(img,kernel,iterations) 

参数:

        img: 要处理的图像

        kernel: 核结构

        iterations: 腐蚀的次数,默认是1

示例

我们使⽤⼀个5*5的卷积核实现腐蚀和膨胀的运算:

import cv2 as cv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

# 1. 读取图⽚
img = cv.imread("E:/m.jpg")
# 2 创建核结构
kernel = np.ones((5, 5), np.uint8)
# 3 图像腐蚀和膨胀
erosion = cv.erode(img, kernel) # 腐蚀
dilate = cv.dilate(img,kernel) # 膨胀
# 4 图像展示
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(img)
axes[0].set_title("原图")
axes[1].imshow(erosion)
axes[1].set_title("腐蚀后结果")
axes[2].imshow(dilate)
axes[2].set_title("膨胀后结果")
plt.show()

 开闭运算

        开运算和闭运算是将腐蚀和膨胀按照⼀定的次序进⾏处理。 但这两者并不是可逆 的,即先开后闭并不能得到原来的图像。

        1. 开运算

                开运算是先腐蚀后膨胀,其作⽤是:分离物体,消除⼩区域。特点:消除噪 点,去除⼩的⼲扰块,⽽不影响原来的图像。

         2. 闭运算

                闭运算与开运算相反,是先膨胀后腐蚀,作⽤是消除/“闭合”物体⾥⾯的孔洞, 特点:可以填充闭合区域。

cv.morphologyEx(img, op, kernel)

参数:

        img: 要处理的图像

        op: 处理⽅式:若进⾏开运算,则设为cv.MORPH_OPEN,若进⾏闭运 算,则设为cv.MORPH_CLOSE

        Kernel: 核结构

示例

        使⽤10*10的核结构对卷积进⾏开闭运算的实现。

import cv2 as cv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

# 1. 读取图⽚
img1 = cv.imread("E:/m.jpg")
img2 = cv.imread("E:/m.jpg")
# 2 创建核结构
kernel = np.ones((10, 10), np.uint8)
# 3 图像的开闭运算
cvOpen = cv.morphologyEx(img1,cv.MORPH_OPEN,kernel) # 开运算
cvClose = cv.morphologyEx(img2,cv.MORPH_CLOSE,kernel)# 闭运算
# 4 图像展示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img1)
axes[0,0].set_title("原图")
axes[0,1].imshow(cvOpen)
axes[0,1].set_title("开运算结果")
axes[1,0].imshow(img2)
axes[1,0].set_title("原图")
axes[1,1].imshow(cvClose)
axes[1,1].set_title("闭运算结果")
plt.show()

礼帽和⿊帽

1. 礼帽运算

        原图像与“开运算“的结果图之差,如下式计算:

        因为开运算带来的结果是放⼤了裂缝或者局部低亮度的区域,因此,从原 图中减去开运算后的图,得到的效果图突出了⽐原图轮廓周围的区域更明亮的 区域,且这⼀操作和选择的核的⼤⼩相关。

        礼帽运算⽤来分离⽐邻近点亮⼀些的斑块。当⼀幅图像具有⼤幅的背景的 时候,⽽微⼩物品⽐较有规律的情况下,可以使⽤顶帽运算进⾏背景提取。

2. ⿊帽运算

        为”闭运算“的结果图与原图像之差。数学表达式为:

        ⿊帽运算后的效果图突出了⽐原图轮廓周围的区域更暗的区域,且这⼀操作和 选择的核的⼤⼩相关。

        ⿊帽运算⽤来分离⽐邻近点暗⼀些的斑块。

cv.morphologyEx(img, op, kernel) 

参数:

        img: 要处理的图像

        op: 处理⽅式:

        Kernel: 核结构

示例

 

import cv2 as cv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

# 1. 读取图⽚
img1 = cv.imread("E:/m.jpg")
img2 = cv.imread("E:/m.jpg")
# 2 创建核结构
kernel = np.ones((10, 10), np.uint8)
# 3 图像的礼帽和⿊帽运算
cvOpen = cv.morphologyEx(img1,cv.MORPH_TOPHAT,kernel) # 礼帽运算
cvClose = cv.morphologyEx(img2,cv.MORPH_BLACKHAT,kernel)# ⿊帽运算
# 4 图像显示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img1)
axes[0,0].set_title("原图")
axes[0,1].imshow(cvOpen)
axes[0,1].set_title("礼帽运算结果")
axes[1,0].imshow(img2)
axes[1,0].set_title("原图")
axes[1,1].imshow(cvClose)
axes[1,1].set_title("⿊帽运算结果")
plt.show()

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv形态学操作 的相关文章

  • 从彩色背景中提取黑色对象

    人眼很容易辨别black来自其他颜色 但是计算机呢 我在普通的A4纸上打印了一些色块 由于组成彩色图像有青色 品红色和黄色三种墨水 所以我设置每个块的颜色C 20 C 30 C 40 C 50 以及其余两种颜色是 0 这是我的源图像的第一列
  • 在 OpenCV 中对 RGB 图像进行阈值处理

    我有一个彩色图像 我想在 OpenCV 中设置阈值 我想要的是 如果任何 RGB 通道低于某个值 则将所有通道中的值设置为零 即黑色 因此 我使用 opencv 阈值函数 cv Mat frame thresholded read fram
  • Aruco 标记与 openCv,获取 3d 角坐标?

    我正在使用 opencv 3 2 检测打印的 Aruco 标记 aruco estimatePoseSingleMarkers corners markerLength camMatrix distCoeffs rvecs tvecs 这将
  • Ubuntu OpenCV 无法编译

    我正在尝试使用以下命令编译 OpenCV 3 2 1 cmake DCMAKE BUILD TYPE Release DBUILD SHARED LIBS OFF DCMAKE INSTALL PREFIX usr local DOPENC
  • OpenCV 在使用 anaconda 的 Linux 上无法与 python 正常工作。收到 cv2.imshow() 未实现的错误

    这就是我得到的确切错误 我的操作系统是 Ubuntu 16 10 OpenCV 错误 未指定错误 该功能未实现 使用 Windows GTK 2 x 或 Carbon 支持重新构建库 如果您使用的是 Ubuntu 或 Debian 请安装
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 使用 cmake 和 opencv 对符号“gzclose”的未定义引用[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我尝试构建该项目 doppia https bitbucket org rodrigob doppia 但发生链接错误 我想这是一
  • 使用畸变从图像平面计算相机矢量

    我正在尝试使用相机模型来重建可以使用某些相机及其 外部 内部 参数拍摄的图像 这一点我没有任何问题 现在我想添加扭曲 正如它们中所描述的那样OpenCV https docs opencv org 4 x dc dbb tutorial p
  • cv2.cv.BoxPoints(rect) 返回什么?

    rect cv2 minAreaRect largest contour rect rect 0 0 self scale down rect 0 1 self scale down rect 1 0 self scale down rec
  • 如何提取图像中的表格

    我想从图像中提取表格 这个 python 模块https pypi org project ExtractTable https pypi org project ExtractTable 与他们的网站https www extractta
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • 如何解决 Python 'Pyzbar' 库的导入错误?

    我刚刚开始熟悉 Pyzbar 库 但是当使用decode方法我得到一个错误 这是代码 import cv2 import numpy as np import pyzbar code image cv2 imread C Users Ace
  • OpenCV findContours 破坏源图像

    我编写了一个在单通道空白图像中绘制圆形 直线和矩形的代码 之后 我只需找出图像中的轮廓 就可以正确获取所有轮廓 但找到轮廓后 我的源图像变得扭曲 为什么会出现这种情况 任何人都可以帮我解决这个问题 我的代码如下所示 using namesp
  • CvMat 和 Imread 与 IpImage 和 CvLoadImage

    使用 OpenCv 2 4 我有两个选项来加载图像 1 CvMat and Imread 2 IpImage and CvLoadImage 使用哪一个更好 我尝试将两者混合并最终出现段错误 imread返回一个Mat not CvMat
  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • BASH 脚本编译多个 C++ 文件 - OpenCV

    请参见在C 和OpenCV中调用其他文件中的函数 https stackoverflow com questions 24442836 call functions in other files in c and opencv 对于最初的问
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de

随机推荐

  • 解决VMware NAT service服务无法启动问题,VMware虚拟机的CentOS/Ubuntu无法上网的解决方法

    解决VMware NAT service服务无法启动问题 VMware虚拟机的CentOS Ubuntu无法上网的解决方法 今日使用VMware中的虚拟机CentOS 6 8 NAT模式 发现没有网络 新建了一个Ubuntu 14 04虚拟
  • Docker(三)实战:-Docker部署Golang项目并关联Mysql容器

    目录 前言 一 获取一个可执行的项目 1 拉取项目 2 配置 二 编写Dockerfile文件 1 作用 2 说明 1 FROM 2 WORKDIR 3 COPY 4 RUN 5 EXPOSE 6 ENTRYPOINT 三 构建Docker
  • Web服务器漏洞小结(中间件)

    IIS IIS是Windows Server中自带的一个Web服务器 IIS出现的漏洞 一 IIS目录解析漏洞 test asp 1 jpg IIS5 x 6 0 以 asp asa cer cdx 命名的文件夹 其目录内的任何扩展名的文件
  • 静态测试方法

    本文讨论人工静态测试方法和自动静态测试方法 来帮你理解研发流程上是如何保证代码质量的 以及如何搭建自己的自动静态代码扫描方案 并且应用到项目的日常开发工作中去 人工静态方法 人工静态方法检查代码错误 主要有代码走查 结对编程 以及同行评审这
  • leetcode Path Sum II

    python Definition for a binary tree node class TreeNode object def init self x self val x self left None self right None
  • Python量化交易:策略创建运行流程

    同学们前面两期量化交易内容 Python量化交易入门 量化交易的历史 Python量化交易项目怎么做 Python量化交易之回测框架介绍 文章目录 学习目标 一 体验创建策略 运行策略流程 1 1 创建策略 1 2 策略界面 二 策略界面功
  • [NOI 2015复习][BZOJ 1509][NOI 2003]逃学的小孩(树的直径)

    题目链接 http www lydsy com JudgeOnline problem php id 1509 题目大意 要从一棵树中找出三个点 X Y Z X Y Z 使得 min dis A C dis B C dis A B min
  • STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

    参考 stm32 超声波模块 原理 实现测距 舵机使用 作者 点灯小哥 发布时间 2021 03 10 19 37 16 网址 https blog csdn net weixin 46016743 article details 1146
  • 利用Albumentations工具包进行图像的数据增强(以yolo数据标注格式为例)

    最近在看数据增强方法时 看到了这个有趣的工具包 研究了下并以yolo数据标注格式为例写了一个示例脚本 该工具最大的好处是会根据你使用的数据增强方法自动修改标注框信息 import albumentations as A import cv2
  • MySQL 数据类型

    整数类型 分类 类型 字节 范围 整数类型 TINYINT 1 128 127 SMALLINT 2 32768 32767 MEDIUMINT 3 8388608 8388607 INT INTEGER 4 2 31 2 31 1 BIG
  • JAVA数据库连接总结

    1 Oracle8 8i 9i数据库 thin模式 Class forName oracle jdbc driver OracleDriver newInstance String url jdbc oracle thin localhos
  • libuv异步文件读写

    libuv 异步文件读写 一 libuv编译环境 1 可查看另一篇 libuv 介绍与编译 http mp blog csdn net postedit 79193274 程序代码 include
  • 2022-04-30 Unity核心2——Sprite

    文章目录 一 Single 图片编辑 二 Multiple 图片编辑 三 Polygon 多边形编辑 四 Sprite Renderer 精灵渲染器 五 Sprite Creator 精灵创造者 六 Sprite Mask 精灵遮罩 七 S
  • Python语言基础—注释的作用及分类

    系列文章目录 Python语言基础 注释的作用及分类 Python语言基础 常用运算符总结 Python语言基础 定义变量与数据类型 Python语言基础 if判断和循环总结 Python语言基础 理解面向对象 Python语言基础 集合的
  • 学习之-Spring Cache缓存框架应用本地缓存

    此文章用于个人学习记录 原文地址 https zhuanlan zhihu com p 452315531 如果想了解springCache与redis的交互请看其他文章 缓存是web项目不可或缺的一部分 通过缓存能够降低服务器数据库压力
  • AIX logging

    复杂度2 5 机密度3 5 最后更新2021 05 15 AIX有很多log 不同的东西 程序 会log到不同的地方 这是有历史的操作系统无法避免的问题 太杂 太乱 有了新机制又要学 旧log又没法简单放弃或者改变 经由alog管理 查看
  • 假设在一个32位little endian的机器上运行下面的程序,结果是多少?

    假设在一个32位little endian的机器上运行下面的程序 结果是多少 假设在一个 32 位 little endian 的机器上运行下面的程序 结果是多少 include
  • 【每日进步一点点】C语言刷题技巧及训练1

    恭喜你发现宝藏 这里是刹那芳间 很高兴为您服务 C语言编程题 相信很多同学学校的C语言考试是上机做编程题叭 不要慌 这里将带你进行一个初步的入门 进行一些简单的编程题练习 Anyway 请一定要去多多实践 上机操作 还有 望具备空杯心态 这
  • React(五)- React组件的组合使用

    React 五 React组件的组合使用 一 Todo案例 1 1 组件的具体实现 1 1 1 Header 1 1 2 List 1 1 3 Item 1 1 4 Footer 1 2 父类App组件的实现 二 Todo案例的总结 Rea
  • opencv形态学操作

    连通性 在图像中 最 的单位是像素 每个像素周围有8个邻接像素 常 的邻接关系有3 种 4邻接 8邻接和D邻接 分别如下图所示 4邻接 像素p x y 的4邻域是 x 1 y x 1 y x y 1 x y 1 N p 表示像素p的4邻接