opencv35-形态学操作-腐蚀cv2.erode()

形态学,即数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研 究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有 重要意义,通常是图像理解时所使用的最本质的形状特征。例如,在识别手写数字时,能够通
过形态学运算得到其骨架信息,在具体识别时,仅针对其骨架进行运算即可。形态学处理在视觉检测、文字识别、医学图像处理、图像压缩编码等领域都有非常重要的应用。

形态学操作主要包含:腐蚀、膨胀、开运算、闭运算、形态学梯度(Morphological Gradient)运算、顶帽运算(礼帽运算)、黑帽运算等操作。腐蚀操作和膨胀操作是形态学运算的基础,
将腐蚀和膨胀操作进行结合,就可以实现开运算、闭运算、形态学梯度运算、顶帽运算、黑帽运算、击中击不中等不同形式的运算。

腐蚀原理

腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。

说白了就是让图片中的胖子慢慢的变成瘦子

腐蚀用来“收缩”或者“细化”二值图像中的前景,借此实现去除噪声、元素分割等功能。

例如,在图 8-1 中,左图是原始图像,右图是对其腐蚀的处理结果。

在这里插入图片描述
在腐蚀过程中,通常使用一个结构元来逐个像素地扫描要被腐蚀的图像,并根据结构元和被腐蚀图像的关系来确定腐蚀结果。

例如,在图 8-2 中,整幅图像的背景色是黑色的,前景对象是一个白色的圆形。图像左上角的深色小方块是遍历图像所使用的结构元。在腐蚀过程中,要将该结构元逐个像素地遍历整幅图像,并根据结构元与被腐蚀图像的关系,来确定腐蚀结果图像中对应结构元中心点位置的像素点的值。

在这里插入图片描述

需要注意的是,腐蚀操作等形态学操作是逐个像素地来改变值的,每次判定的点都是与结构元中心点所对应的点。

图 8-3 中的两幅图像表示结构元与前景色的两种不同关系。
根据这两种不同的关系来决定,腐蚀结果图像中的结构元中心点所对应位置像素点的像素值。

  1. 如果结构元完全处于前景图像中(图 8-3 的左图),就将结构元中心点所对应的腐蚀结果图像中的像素点处理为前景色(白色,像素点的像素值为 1)。
  2. 如果结构元未完全处于前景图像中(可能部分在,也可能完全不在,图 8-3 的右图),就将结构元中心点对应的腐蚀结果图像中的像素点处理为背景色(黑色,像素点的像素值为 0)。

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

例如,有需要被腐蚀的图像 img,其值如下,其中 1 表示白色前景,0 表示黑色背景:

[[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]
[1]
[1]]

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

[[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 在图像 img 内逐个像素遍历时,只有当核 kernel 的中心点 “kernel[1,0]”位于 img 中的 img[2,1]、img[2,2]、img[2,3]时,核才完全处于前景图像中。

所以在腐蚀结果图像 rst 中,只有这三个点的值被处理为 1,其余像素点的值被处理为 0。

上述示例如图 8-4 所示,其中:

  1. 图(a)表示要被腐蚀的 img。
  2. 图(b)是核 kernel。
  3. 图©中的阴影部分是 kernel 在遍历 img 时,kernel 完全位于前景对象内部时的 3 个全部
    可能位置;此时,核中心分别位于 img[2,1]、img[2,2]和 img[2,3]处。
  4. 图(d)是腐蚀结果 rst,即在 kernel 完全位于前景图象中时,将其中心点所对应的 rst 中像素点的值置为 1;当 kernel 不完全位于前景图像中时,将其中心点对应的 rst 中像素点的值置为 0。

在这里插入图片描述

函数 cv2.erode() 说明

在 OpenCV 中,使用函数 cv2.erode()实现腐蚀操作,其语法格式为:

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

式中:

  1. dst 是腐蚀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。

  2. src 是需要进行腐蚀的原始图像,图像的通道数可以是任意的。但是要求图像的深度必须是 CV_8U、CV_16U、CV_16S、CV_32F、CV_64F 中的一种。

  3. kernel 代表腐蚀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。

  4. anchor 代表 element 结构中锚点的位置。该值默认为(-1,-1),在核的中心位置。

  5. iterations 是腐蚀操作迭代的次数,该值默认为 1,即只进行一次腐蚀操作。

  6. borderType 代表边界样式,一般采用其默认值 BORDER_CONSTANT。该项的具体值如表 8-1 所示。

在这里插入图片描述

  1. borderValue 是边界值,一般采用默认值。在 C++中提供了函数 morphologyDefaultBorderValue()来返回腐蚀和膨胀的“魔力(magic)”边界值,Python 不支持该函数

代码示例 :使用数组演示腐蚀的基本原理

代码如下:

import cv2
import numpy as np
img=np.zeros((5,5),np.uint8)
#对图像进行赋值
img[1:4,1:4]=1
#设置卷积核
kernel = np.ones((3,1),np.uint8)
#对图像进行腐蚀操作
erosion = cv2.erode(img,kernel)
print("img=\n",img)
print("kernel=\n",kernel)
print("erosion=\n",erosion)

运行结果:

img=[[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][1][1]]
erosion=[[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 的中心点位于 img 中的 img[2,1]、img[2,2]、img[2,3]处时,核才完全处于前景图像中。

所以,在腐蚀结果图像中,只有这三个点的值为 1,其余点的值皆为 0。

示例2:使用函数 cv2.erode()完成图像腐蚀

代码如下:

import cv2
import numpy as np
o=cv2.imread("fushi.bmp",cv2.IMREAD_UNCHANGED)
#创建结构元素
kernel = np.ones((7,7),np.uint8)
#腐蚀
erosion = cv2.erode(o,kernel)
cv2.imshow("orriginal",o)
cv2.imshow("erosion",erosion)
cv2.waitKey()
cv2.destroyAllWindows()

运行效果:
左图是原始图像,右图是腐蚀处理结果。从图中可
以看到,腐蚀操作将原始图像内的毛刺腐蚀掉了。
在这里插入图片描述

调节函数 cv2.erode()的参数,观察不同参数控制下的图像腐蚀效果
使用参数 iterations = 5 对函数 cv2.erode()的迭代次数进行控制,让其迭代 5 次。

代码如下:

import cv2
import numpy as np
o=cv2.imread("fushi.bmp",cv2.IMREAD_UNCHANGED)
#创建结构元素
kernel = np.ones((7,7),np.uint8)
#腐蚀
erosion = cv2.erode(o,kernel,iterations = 5)
cv2.imshow("orriginal",o)
cv2.imshow("erosion",erosion)
cv2.waitKey()
cv2.destroyAllWindows()

从结果中可以看出迭代的次数越多,腐蚀的越明显
在这里插入图片描述

更多参数调整测试可以自己多动手试试

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

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

相关文章

Docker实战-操作Docker容器实战(二)

导语   上篇分享中,我们介绍了关于如何创建容器、如何启动容器、如何停止容器。这篇我们来分享一下如何操作容器。 如何进入容器 可以通过使用-d参数启动容器后会进入后台运行,用户无法查看容器中的信息,无法对容器中的信息进行操作。 这个时候如果我们需要进入容器对容器…

聊聊比亚迪的DM-i技术

比亚迪的DM-i技术是一种混合动力技术,结合了燃油发动机和电动技术,旨在提高汽车的燃油经济性和环境友好性。 DM-i技术的核心是搭载了一台高效的燃油发动机和一组电动机,通过电子控制系统实现两者的协同工作。在日常行驶中,汽车首先…

SpringBoot项目-个人博客系统的实现【下】

10.实现强制要求登陆 当用户访问 博客列表页和 博客详情页时, 如果用户当前尚未登陆, 就自动跳转到登陆页面 1.添加拦截器 public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletRespon…

kubernetes基于helm部署gitlab-runner

kubernetes基于helm部署gitlab-runner 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-runner。 先决条件: 已运行的 Kubernetes 集群已运行的 gitlab 实例 项目地址:https://gitlab.com/gitlab-org/charts/gitlab-runner 官方文档&#xff…

深度学习——注意力机制、自注意力机制

什么是注意力机制? 1.注意力机制的概念: 我们在听到一句话的时候,会不自觉的捕获关键信息,这种能力叫做注意力。 比如:“我吃了100个包子” 有的人会注意“我”,有的人会注意“100个”。 那么对于机器来说…

【LeetCode-简单】剑指 Offer 52. 两个链表的第一个公共节点

题目 输入两个链表,找出它们的第一个公共节点。 如下面的两个链表: 在节点 c1 开始相交。 输入:intersectVal 8, listA [4,1,8,4,5], listB [5,0,1,8,4,5], skipA 2, skipB 3 输出:Reference of the node with value 8 输…

Android优化篇|网络预连接

作者:苍耳叔叔 一个示例 前后分别去请求同一个域名下的接口,通过 Charles 抓包,可以看到 Timing 下面的时间: 第二次请求时,DNS、Connect 和 TLS Handshake 部分都是 -,说明没有这部分的耗时,…

大麦订单生成器 大麦一键生成订单

后台一键生成链接,独立后台管理 教程:修改数据库config/Conn.php 不会可以看源码里有教程 下载源码程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

使用langchain与你自己的数据对话(四):问答(question answering)

之前我已经完成了使用langchain与你自己的数据对话的前三篇博客,还没有阅读这三篇博客的朋友可以先阅读一下: 使用langchain与你自己的数据对话(一):文档加载与切割使用langchain与你自己的数据对话(二):向量存储与嵌入使用langc…

opencv-34 图像平滑处理-2D 卷积 cv2.filter2D()

2D卷积是一种图像处理和计算机视觉中常用的操作,用于在图像上应用滤波器或卷积核,从而对图像进行特征提取、平滑处理或边缘检测等操作。 在2D卷积中,图像和卷积核都是二维的矩阵或数组。卷积操作将卷积核在图像上滑动,对每个局部区…

百度智能云“千帆大模型平台”最新升级:接入Llama 2等33个模型!

今年3月,百度智能云推出“千帆大模型平台”。作为全球首个一站式的企业级大模型平台,千帆不但提供包括文心一言在内的大模型服务及第三方大模型服务,还提供大模型开发和应用的整套工具链,能够帮助企业解决大模型开发和应用过程中的…

【云原生】Docker中容器管理常用所有命令

1.docker 容器创建流程 2.容器运行本质 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器基本选项:--name:为容器命名 -i:交互式创建容器 -d:后台创建容器 -t:为容器分配伪终端 Docker 容器存在的意义就是为…