opencv36-形态学操作-膨胀 cv2.dilate()

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的距离较近,那么在膨胀的过程中,两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空白相当有帮助。

原理:

二值图像的膨胀示例如图 8-8 所示。

同腐蚀过程一样,在膨胀过程中,也是使用一个结构元来逐个像素地扫描要被膨胀的图像,并根据结构元和待膨胀图像的关系来确定膨胀结果。

在这里插入图片描述
例如,在图 8-9 中,整幅图像的背景色是黑色的,前景对象是一个白色的圆形。图像左上角的深色小块表示遍历图像所使用的结构元。在膨胀过程中,要将该结构元逐个像素地遍历整幅图像,并根据结构元与待膨胀图像的关系,来确定膨胀结果图像中与结构元中心点对应位置像素点的值。

在这里插入图片描述

图 8-10 中的两幅图像代表结构元与前景色的两种不同关系。根据这两种不同关系来决定
膨胀结果图像中,与结构元中心像素重合的点的像素值。

  1. 如果结构元中任意一点处于前景图像中,就将膨胀结果图像中对应像素点处理为前景色。
  2. 如果结构元完全处于背景图像外,就将膨胀结果图像中对应像素点处理为背景色。

在这里插入图片描述
针对图 8-10 中的图像,膨胀的结果就是前景对象的白色圆直径变大。上述结构元也被称为核。

例如,有待膨胀的图像 img,其值为:

[[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 1 0]
[0 0 0 0 0]
[0 0 0 0 0]]

有一个结构元 kernel,其值为:

[[1]
[1]
[1]]

如果使用结构元 kernel 对图像 img 进行膨胀,则可以得到膨胀结果图像 rst:

[[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]

这是因为当结构元 kernel 在图像 img 内逐个像素地进行遍历时,当核 kernel 的中心点 kernel[1,0]位于 img 中的 img[1,1]、img[1,2]、img[1,3]、img[2,1]、img[2,2]、img[2,3]、img[3,1]、img[3,2]或 img[3,3]处时,核内像素点都存在与前景对象重合的像素点。所以,在膨胀结果图像中,这 9 个像素点的值被处理为 1,其余像素点的值被处理为 0。

上述示例的示意图如图 8-11 所示,其中:

  • 图(a)表示待膨胀的 img。

  • 图(b)是核 kernel。

  • 图©中的阴影部分是 kernel 在遍历 img 时,kernel 中心像素点位于 img[1,1]、img[3,3]
    时与前景色存在重合像素点的两种可能情况,实际上共有 9 个这样的与前景对象重合的可能位置。核 kernel 的中心分别位于 img[1,1]、img[1,2]、img[1,3]、img[2,1]、img[2,2]、
    img[2,3]、img[3,1]、img[3,2]或 img[3,3]时,核内像素点都存在与前景图像重合的像素点。

  • 图(d)是膨胀结果图像 rst。在 kernel 内,当任意一个像素点与前景对象重合时,其中心点所对应的膨胀结果图像内的像素点值的为 1;当 kernel 与前景对象完全无重合时,其中心点对应的膨胀结果图像内像素点的值为 0。

在这里插入图片描述

函数说明:

在 OpenCV 内,采用函数 cv2.dilate()实现对图像的膨胀操作,该函数的语法结构为:

dst = cv2.dilate( src, kernel[, anchor[, iterations[, borderType[,
borderValue]]]])

式中:

  • dst 代表膨胀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
  • src 代表需要进行膨胀操作的原始图像。图像的通道数可以是任意的,但是要求图像的深度必须是 CV_8U、CV_16U、CV_16S、CV_32F、CV_64F 中的一种。
  • element 代表膨胀操作所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
    参数 kernel、anchor、iterations、borderType、borderValue 与函数 cv2.erode()内相应参数的含义一致。

代码示例:使用数组演示膨胀的基本原理

import cv2
import numpy as np
img=np.zeros((5,5),np.uint8)
img[2:3,1:4]=1
kernel = np.ones((3,1),np.uint8)
#对图像进行膨胀操作
dilation = cv2.dilate(img,kernel)
print("img=\n",img)
print("kernel=\n",kernel)
print("dilation\n",dilation)

运行结果:

img=[[0 0 0 0 0][0 0 0 0 0][0 1 1 1 0][0 0 0 0 0][0 0 0 0 0]]
kernel=[[1][1][1]]
dilation[[0 0 0 0 0][0 1 1 1 0][0 1 1 1 0][0 1 1 1 0][0 0 0 0 0]]

从本例中可以看到,只要当核 kernel 的任意一点处于前景图像中时,就将当前中心点所对应的膨胀结果图像内像素点的值置为 1。

示例2:使用函数 cv2.dilate()完成图像膨胀操作。

在这里插入图片描述
代码如下;

import cv2
import numpy as np
o=cv2.imread("dilation.bmp",cv2.IMREAD_UNCHANGED)
kernel = np.ones((9,9),np.uint8)
dilation = cv2.dilate(o,kernel)
cv2.imshow("original",o)
cv2.imshow("dilation",dilation)
cv2.waitKey()
cv2.destroyAllWindows()

在本例中,使用语句 kernel=np.ones((9,9),np.uint8)生成 9×9 的核,来对原始图像进行膨胀操作。

运行结果:

左图是原始图像,右图是膨胀处理结果。从图中可以看到,膨胀操作将原始图像“变粗”了。
在这里插入图片描述

示例3:调节函数 cv2.dilate()的参数,观察不同参数控制下的图像膨胀效果。

import cv2
import numpy as np
o=cv2.imread("dilation.bmp",cv2.IMREAD_UNCHANGED)
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(o,kernel,iterations = 9)
cv2.imshow("original",o)
cv2.imshow("dilation", dilation)
cv2.waitKey()
cv2.destroyAllWindows()

在本例中,参数做了两个调整:

  • 核的大小变为 5×5。
  • 使用语句 iterations = 9 对迭代次数进行控制,让膨胀重复 9 次。

运行结果:

在这里插入图片描述
左图是原始图像,右图是膨胀处理结果。从图中
可以看到,膨胀操作让原始图像实现了“生长”。在本例中,由于重复了 9 次,所以图像被膨胀得更严重了。

更多的操作自己多动手实验感受一下

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

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

相关文章

替换开源LDAP,某科技企业用宁盾目录统一身份,为业务敏捷提供支撑

客户介绍 某高科技企业成立于2015年,是一家深耕于大物流领域的人工智能公司,迄今为止已为全球16个国家和地区,120余家客户打造智能化升级体验,场景覆盖海陆空铁、工厂等货运物流领域。 该公司使用开源LDAP面临的挑战 挑战1 开源…

读取文件和写入文件操作

在java中会涉及到对文件进行读取和写入操作,以下将介绍如何用java对文件进行读取和写入 读取 通过Readr读取字符流文件中的数据 读取字符流文件中的数据表示以字符为单位进行读取 package 文件操作;import java.io.*;/*** Created with IntelliJ IDEA.* Descript…

ubuntu调整路由顺序

Ubuntu系统跳转路由顺序 1、安装ifmetric sudo apt install ifmetric2、查看路由 route -n3、把Iface下面的eth1调到第一位 sudo ifmetric eth1 0命令中eth1是网卡的名称,更改网卡eth1的跃点数(metric值)为0(数值越小&#xf…

Spring Boot集成Mybatis-Plus

Spring Boot集成Mybatis-Plus 1. pom.xml导包 <!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mysql驱动--><dependency><groupId>mysql<…

【排序算法】python之冒泡,选择,插入,快速,归并

参考资料&#xff1a; 《Python实现5大排序算法》《六大排序算法&#xff1a;插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序》 --代码似乎是C语言 ———————— 本文介绍5种常见的排序算法和基于Python实现&#xff1a; 冒泡排序&#xff08;Bubble Sort&am…

【C++】哈希开散列 | unordered系列容器的封装

文章目录 一.开散列1. 开散列的概念2. 开散列结构3. Insert 插入4. Find 查找5. Insert 扩容6. Erase 删除7. 析构函数8. 其它函数接口9. 性能测试 二.封装1. 封装内部结构2. 实现接口 三.代器器1. 迭代器的定义2. 常用接口3. 迭代器4. begin()、end()5. find的改动6. 下标访问…

检查网站是HTTP那种协议与获取域名的ipv6地址

前言 最近在做HTTPS的应用&#xff0c;可能需要使用ipv6的地址做SLB&#xff0c;但是怎么检查配置正确&#xff0c;总不能每次都看日志吧&#xff0c;实际上客户端也很容易查看&#xff0c;总结工作经验。 检查HTTP协议版本 笔者想到了使用浏览器方式&#xff0c;或者抓包&a…

Java Selenium WebDriver 网页填报

一、windows环境安装配置 1.安装chrome浏览器 在“关于chrome”界面&#xff0c;查看浏览器版本号 2.下载chromeDriver 在https://registry.npmmirror.com/binary.html?pathchromedriver/下载对应版本的驱动&#xff08;如果浏览器版本过新&#xff0c;建议下载最接近的版…

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62

一、XtraBackup 简介 Percona XtraBackup是一个开源的MySQL和MariaDB数据库备份工具&#xff0c;它能够创建高性能、一致性的备份&#xff0c;并且对生产环境的影响很小。Percona XtraBackup通过在不停止MySQL服务器的情况下&#xff0c;复制InnoDB存储引擎的数据文件和事务日…

fetch-github-hosts间隔一年大更新v2.6发布,多端支持

前言 fetch-github-hosts是一款同步 github hosts 的工具&#xff0c;用于帮助您解决github时而无法访问的问题。在间隔了一年之久的时间&#xff0c;最近抽空将fetch-github-hosts的依赖及UI进行了一波大更新&#xff0c;同时也增加了一些实用的功能。 主要更新 更新了基础依…

Linux 中利用设备树学习Ⅳ

系列文章目录 第一章 Linux 中内核与驱动程序 第二章 Linux 设备驱动编写 &#xff08;misc&#xff09; 第三章 Linux 设备驱动编写及设备节点自动生成 &#xff08;cdev&#xff09; 第四章 Linux 平台总线platform与设备树 第五章 Linux 设备树中pinctrl与gpio&#xff08;…

【传统视觉】C#创建、封装、调用类库

任务 因为实现代码相对简单&#xff0c;然后又没有使用Opencv&#xff0c;所以就直接用C#实现&#xff0c;C#调用。 1.创建类库 1.1新建一个类库 vs2015 > 文件 > 新建 > 项目 using System; using System.Collections.Generic; using System.Linq;namespace Yo…