opencv图像处理技术(形态学操作)

news2025/6/20 20:05:48

 

形态学(Morphology)是数学中研究形状、结构和变换的分支,而在图像处理中,形态学主要用于描述和分析图像中的形状和结构。形态学操作通常涉及基本的集合运算,如腐蚀、膨胀、开运算、闭运算等,以及与结构元素(structuring element)的结合使用。

以下是形态学中一些重要的定义和知识点:

1. 结构元素(Structuring Element):

结构元素是形态学操作的基本组成部分,它定义了形态学操作的形状和大小。通常是一个小的矩形、圆形或其他形状的核。在腐蚀和膨胀等操作中,结构元素在图像上滑动并与图像进行匹配,用来确定操作的范围。

2. 腐蚀(Erosion):

腐蚀操作可以使图像中的边缘“腐蚀”掉,使其变得更加平滑。腐蚀操作的基本思想是使用结构元素,在图像上滑动并检查像素与结构元素的对应位置是否满足某种条件。如果像素值全部满足条件,则中心像素值保持不变,否则被腐蚀为0。

3. 膨胀(Dilation):

膨胀操作与腐蚀相反,它可以增加图像中对象的大小并填充对象之间的空隙。膨胀操作也使用结构元素,在图像上滑动并检查像素与结构元素的对应位置是否满足条件。如果结构元素与任何一个像素相交,则中心像素值被膨胀为1。

4. 开运算(Opening)与闭运算(Closing):

开运算是先进行腐蚀再进行膨胀的操作,可以用来消除小型噪声、分离接触对象等;闭运算是先进行膨胀再进行腐蚀的操作,可以用来填充物体间的空隙、连接断裂的物体等。

5. 形态学梯度(Morphological Gradient):

形态学梯度是膨胀图像与腐蚀图像的差异,用来确定图像中物体的边缘。

6. 顶帽运算(Top Hat)与底帽运算(Black Hat):

顶帽运算是原始图像与开运算之间的差异,用来提取比原始图像更亮的区域;底帽运算是闭运算与原始图像之间的差异,用来提取比原始图像更暗的区域。

形态学操作在图像处理中有着广泛的应用,对于图像分割、特征提取、物体检测等任务都具有重要作用。

知识点1 腐蚀与膨胀

1腐蚀操作
腐蚀操作可以将图像中的边缘“腐蚀”掉,使其变得更加平滑。它的原理是使用一个称为结构元素(Structuring Element)的小型矩阵,在图像上滑动并检查像素与结构元素的对应位置是否满足某种条件(通常是“与”操作)。如果像素值全部满足条件,则中心像素值保持不变,否则被腐蚀为0。这一过程可以用来消除小型噪声、分离接触对象、以及缩小物体等。

在 OpenCV 中,腐蚀操作的函数是 cv2.erode()。下面是它的语法格式和含义:

代码:

dst = cv2.erode(src, kernel, iterations = 1, anchor = (-1, -1), borderType = cv2.BORDER_CONSTANT, borderValue = 0)
  • src:表示输入图像,即待腐蚀的图像,应为灰度图像或者单通道二值图像。

  • kernel:表示结构元素,即定义腐蚀操作的形状和大小的矩阵。通常是一个正方形或矩形的小矩阵。你可以使用 np.ones() 函数来创建一个全为1的矩阵作为结构元素。例如,kernel = np.ones((5,5), np.uint8) 创建了一个5x5的全为1的矩阵作为结构元素。

  • iterations:表示腐蚀操作的迭代次数,即在图像上应用腐蚀操作的次数。默认为1。

  • anchor:表示结构元素的锚点位置,默认为(-1, -1),即结构元素的中心点。你也可以设置为其他值,通常情况下保持默认值即可。

  • borderType:表示边界处理方式,默认为 cv2.BORDER_CONSTANT,即在边界外的像素值使用常数填充,常数值由 borderValue 参数指定。

  • borderValue:当 borderType 设置为 cv2.BORDER_CONSTANT 时,表示边界外像素的值,默认为0。

这个函数会返回一个腐蚀后的图像 dst

腐蚀操作的基本思想是,对于给定的结构元素,在图像上滑动并检查像素与结构元素的对应位置是否满足某种条件。如果像素值全部满足条件,则中心像素值保持不变,否则被腐蚀为0。

具体实现:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png")

# 创建一个5x5的全为1的矩阵作为结构元素
kernel = np.ones((5,5), np.uint8)

# 对图像进行腐蚀操作
erosion = cv2.erode(img, kernel, iterations=1)

# 显示原始图像和腐蚀后的图像
cv2.imshow('img', img)
cv2.imshow('Erosion', erosion)

# 等待用户按下任意键,并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图:

 2膨胀操作
  1. 膨胀操作(Dilation)

膨胀操作是图像形态学处理中的一种基本操作,通常用于增加或扩展图像中的白色区域(前景对象)。它的原理是在图像上滑动一个结构元素(通常是一个小的矩形或圆形内核),将内核下方的像素值替换为内核下方区域内的最大像素值。因此,它会使图像中的白色区域变得更大。膨胀操作常用于填充图像中的空洞、连接相邻的对象以及消除图像中的噪声。

在OpenCV中,膨胀操作可以通过cv2.dilate()函数实现。该函数需要传入待处理的图像、结构元素(通常是一个矩形或圆形内核)以及迭代次数作为参数。迭代次数表示膨胀操作的次数,通常设置为1即可。

代码:

dilation = cv2.dilate(img, kernel, iterations=1)
  • img 是待处理的图像,即输入图像。
  • kernel 是结构元素,用于定义膨胀操作的形状和大小
  • iterations 表示膨胀操作的迭代次数,即要对图像应用膨胀操作的次数

具体实现:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png")

# 创建一个5x5的全为1的矩阵作为结构元素
kernel = np.ones((5,5), np.uint8)

# 对图像进行膨胀操作
dilation = cv2.dilate(img, kernel, iterations=1)

# 显示原始图像和膨胀后的图像
cv2.imshow('Original Image', img)  # 显示原始图像窗口,窗口标题为"Original Image"
cv2.imshow('Dilation', dilation)  # 显示膨胀后的图像窗口,窗口标题为"Dilation"

# 等待用户按下任意键,并关闭窗口
cv2.waitKey(0)  # 等待用户按下任意键
cv2.destroyAllWindows()  # 关闭所有窗口

结果如图:

 知识点2通用形态学函数

在OpenCV中,常用的通用形态学函数是cv2.morphologyEx()函数。该函数可以接受不同的形态学操作类型作为参数,并且可以自定义结构元素。

result = cv2.morphologyEx(img, op, kernel)
  • img 是待处理的图像,即输入图像。
  • op 是形态学操作的类型,可以是如下之一:
    • cv2.MORPH_ERODE:腐蚀操作。
    • cv2.MORPH_DILATE:膨胀操作。
    • cv2.MORPH_OPEN:开运算,先进行腐蚀操作再进行膨胀操作。
    • cv2.MORPH_CLOSE:闭运算,先进行膨胀操作再进行腐蚀操作。
    • 其他形态学操作类型,如梯度运算、顶帽运算等。
      • 顶帽运算

        top_hat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
        

        这里,cv2.MORPH_TOPHAT表示顶帽运算的操作类型,kernel是定义操作的结构元素。通过该行代码,将对输入图像img进行顶帽运算,并将结果保存在top_hat中。

      • 黑帽运算

        black_hat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
        

        在这行代码中,cv2.MORPH_BLACKHAT表示黑帽运算的操作类型,kernel是结构元素。执行该行代码将对输入图像img进行黑帽运算,并将结果保存在black_hat中。

      • 梯度运算

        • 内梯度

          internal_gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
          

          这里,cv2.MORPH_GRADIENT表示梯度运算的操作类型,对于内梯度,该函数将执行图像的膨胀操作,然后从原始图像中减去膨胀后的结果。结果将保存在internal_gradient中。

        • 外梯度

          external_gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
          
  • kernel 是结构元素,用于定义形态学操作的形状和大小。

具体实现:

1cv2.MORPH_OPEN:进行开运算

代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png", 0)

# 定义结构元素
kernel = np.ones((5, 5), np.uint8)

# 执行开运算操作
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

# 显示原始图像
cv2.imshow('img', img)

# 显示开运算后的图像
cv2.imshow('opening', opening)

# 等待用户按下任意键退出
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

结果如图:

 2 cv2.MORPH_CLOSE:闭运算

具体实现:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png", 0)

# 定义结构元素
kernel = np.ones((5, 5), np.uint8)

# 执行闭运算操作
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

# 显示原始图像
cv2.imshow('img', img)

# 显示闭运算后的图像
cv2.imshow('closing', closing)

# 等待用户按下任意键退出
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

结果如图:

 3 cv2.MORPH_GRADIENT进行形态学梯度运算

 代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2.png")

# 定义结构元素
kernel = np.ones((5, 5), np.uint8)

# 执行梯度运算操作
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

# 显示原始图像
cv2.imshow('img', img)

# 显示梯度运算后的图像
cv2.imshow('gradient', gradient)

# 等待用户按下任意键退出
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

结果如图:

 4  cv2.MORPH_BLACKHAT进行黑帽操作

代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png", 0)

# 定义结构元素
kernel = np.ones((5, 5), np.uint8)

# 执行黑帽运算操作
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

# 显示原始图像
cv2.imshow('img', img)

# 显示黑帽运算后的图像
cv2.imshow('blackhat', blackhat)

# 等待用户按下任意键退出
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

结果如图:

5 cv2.MORPH_TOPHAT 进行顶帽操作

代码:

import cv2
import numpy as np
img=cv2.imread("C:/Users/computer/opencv/sucai5/cv2z.png",0)
kernel=np.ones((5,5),np.uint8)
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('img',img)
cv2.imshow('tophat',tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图:

 知识点3:形态学结构元

形态学结构元素是形态学图像处理中的一个重要概念。它是一个二值图像,通常是一个小的二值图像,用于定义形态学操作的形状和大小。

在形态学操作中,结构元素被用来改变图像的形状、大小、或提取图像中的特定特征。常见的形态学操作包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算等。

结构元素通常是一个矩形或圆形的二值图像,由一组相邻的像素点组成。在执行形态学操作时,结构元素在图像上滑动,并与图像中的像素进行匹配,根据匹配的规则来改变像素的值或者提取特征。

结构元素的大小和形状对形态学操作的效果具有重要影响。通常情况下,较小的结构元素会导致较细的特征被保留或强调,而较大的结构元素则会使特征更加模糊或平滑。

在 OpenCV 中,结构元素通常通过 cv2.getStructuringElement() 函数创建,其语法格式如下:

element = cv2.getStructuringElement(shape, ksize[, anchor])

其中:

  • shape 表示结构元素的形状,可以是 cv2.MORPH_RECT(矩形)、cv2.MORPH_CROSS(十字形)或 cv2.MORPH_ELLIPSE(椭圆形)之一。
  • ksize 表示结构元素的大小,通常是一个元组,指定了结构元素的高度和宽度。
  • anchor 是可选参数,表示锚点的位置,默认值为 (-1, -1),即结构元素的中心点

常见的结构元类型主要包括以下几种:

  1. 矩形结构元素 (cv2.MORPH_RECT):矩形结构元素是最常用的类型之一。它可以用来执行基本的形态学操作,如腐蚀和膨胀。矩形结构元素的大小由指定的高度和宽度决定,可以用来模拟图像中的线性特征。

  2. 十字形结构元素 (cv2.MORPH_CROSS):十字形结构元素通常用于梯度运算。它类似于矩形结构元素,但在中间有一条十字交叉的空隙,使得该结构元素在边缘检测和特定区域提取方面更具有效性。

  3. 椭圆形结构元素 (cv2.MORPH_ELLIPSE):椭圆形结构元素适用于某些特定形状的目标提取或者对图像进行平滑操作。椭圆形结构元素相对于矩形结构元素更加圆滑,可以更好地适应某些曲线和形状。

具体实现:生成不同形状的结构元

代码:

import cv2

# 创建矩形结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 创建一个 5x5 的矩形结构元素
# 创建十字形结构元素
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 创建一个 5x5 的十字形结构元素
# 创建椭圆形结构元素
kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 创建一个 5x5 的椭圆形结构元素
# kernel3=cv2.getStructuringElement(cv2.MORPH_ELLTPSE,(5,5))  # 如果拼写错误,会报错

# 输出结构元素
print("kernel1=\n", kernel1)  # 输出矩形结构元素
print("kernel2=\n", kernel2)  # 输出十字形结构元素
print("kernel3=\n", kernel3)  # 输出椭圆形结构元素

结果如图:

 不同形状的结构体元形态学运算对比

代码:

import cv2

# 读取图像
src = cv2.imread("C:/Users/win11/opencv/sucai5/cv2.png")

# 创建矩形结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (55, 55))  # 创建一个 55x55 的矩形结构元素
# 创建十字形结构元素
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (55, 55))  # 创建一个 55x55 的十字形结构元素

# 使用形态学膨胀操作
dst1 = cv2.morphologyEx(src, cv2.MORPH_DILATE, kernel1)  # 使用矩形结构元素进行膨胀操作
dst2 = cv2.morphologyEx(src, cv2.MORPH_DILATE, kernel2)  # 使用十字形结构元素进行膨胀操作
dst3 = cv2.morphologyEx(src, cv2.MORPH_DILATE, kernel2)  # 使用十字形结构元素进行膨胀操作(此处可能应为 kernel3)

# 显示图像
cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.imshow('dst3', dst3)  # 此处可能应修改窗口标题为 '十字形结构元素膨胀'

# 等待键盘输入,并释放窗口资源
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图:

 

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

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

相关文章

云原生__K8S

createrepo --update /var/localrepo/# 禁用 firewall 和 swap [rootmaster ~]# sed /swap/d -i /etc/fstab [rootmaster ~]# swapoff -a [rootmaster ~]# dnf remove -y firewalld-*[rootmaster ~]# vim /etc/hosts 192.168.1.30 harbor 192.168.1.50 master 192.168.1.…

互联网大厂ssp面经之路:计算机网络part1

1. 计算机网络的组成部分有哪些? a. 硬件设备:计算机网络由各种硬件设备组成,包括计算机、服务器、路由器、交换机、网卡等。这些设备通过物理连接(如网线、光纤)相互连接。 b. 协议:计算机网络中的通信需…

一个巧用委托解决的问题(C#)

个人觉得是委托应用的一个很好的例子,故做一下分享,希望能帮助到您,内容比较简单,大佬可以跳过。我是做桌面医疗软件开发的,前段时间在做一个需求。在签发检验项目医嘱时,调用第三方接口,然后带…

什么是生成式AI?有哪些特征类型

生成式AI是人类一种人工智能技术,可以生成各种类型的内容,包括文本、图像、音频和合成数据。那么什么是人工智能?人工智能和机器学习之间的区别是什么?有哪些技术特征? 人工智能是一门学科,是计算机科学的一…

漫途水产养殖水质智能监测方案,科技助力养殖业高效生产!

随着水产养殖业的蓬勃发展,水质和饲料等多重因素逐渐成为影响其持续健康发展的关键因素。由于传统养殖模式因监控和调节手段不足,往往造成养殖环境的恶化。需要通过智能化养殖,调控养殖环境,实现养殖的精细化管理模式,…

Python爬虫网络实践:去哪儿旅游数据爬取指南

Python爬虫网络实践:去哪儿旅游数据爬取指南 在这个博客中,我们将探索如何使用 Python 来进行网络数据抓取,并以抓取旅游数据为例进行演示。我们将通过一个简单的示例来说明如何利用 Python 中的常用库进行网页抓取,从而获取旅游…

Go语言开发工具Vscode配置

Go语言开发工具Vscode配置方法分享: 1.下载安装vscode https://code.visualstudio.com/ 2.汉化vscode 3.vscode中安装Go语言插件 源自:大地老师Golang语言beego入门实战视频教程下载地址

rsync 远程同步----------安全高效的异地备份方案

目录 一、rsync介绍 rsync和cp的区别 rsync和scp的区别 二、rsync同步方式 rsync备份的方式 三、配置rsync源服务器 ①本地复制 ②下行同步 ③上行同步 四、常用Rsync命令 五、配置源的两种表达方法 六、部署rsync下行同步 ①环境准备 ②配置rsync源服务器------…

[大模型]Qwen1.5-7B-Chat 接入 LangChain 搭建知识库助手

Qwen1.5-7B-Chat 接入 LangChain 搭建知识库助手 环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器,如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的 JupyterLab,并且打开其中的终端…

String类(1)

❤️❤️前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&a…

45-基于Kubernetes的云原生架构设计

云原生简介 云原生包含的概念很多,对于一个应用开发者来说,主要关注点是如何开发应用,以及如何部署应用。会主要介绍应用层的云原生架构设计和系统资源层的云原生架构设计。 CNCF(云原生计算基金会)简介 CNCF&#x…

竞品数据的监测范围

常规的数据监测一般指的是价格监测,品牌对线上产品链接中的页面价、到手价进行监测,同时也可监测标题变化、销量变化、库存变化、优惠信息变化等,对于对够执行数据监测的系统来说,不管哪个品牌的数据都可做到以上维度的监测&#…

SOCKS代理概述

在网络技术的广阔领域中🌐,SOCKS代理是一个核心组件,它在提升在线隐私保护🛡️、实现匿名通信🎭以及突破网络访问限制🚫方面发挥着至关重要的作用。本文旨在深入探讨SOCKS代理的基础,包括其定义…

阿里云云效CI/CD配置

1.NODEJS项目流水线配置(vue举例) nodejs构建配置 官方教程 注意:下图的dist是vue项目打包目录名称,根据实际名称配置 # input your command here cnpm cache clean --force cnpm install cnpm run build 主机部署配置 rm -rf /home/vipcardmall/frontend/ mkdir -p /home/…

SV-7042V 40W网络有源音柱 智慧灯杆广播音柱

SV-7042V 40W网络有源音柱 一、描述 SV-7042V是深圳锐科达电子有限公司的一款壁挂式网络有源音柱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,其采用防水设计,功率40W。 SV-7042V作为网络广播播放系统的终…

Go——网络编程

一. 互联网协议介绍 网络基础——网络传输基本流程_网络传输过程-CSDN博客 应用层HTTP协议-CSDN博客 传输层UDP/TCP协议_udp报文提供的确认号用于接收方跟发送方确认-CSDN博客 网络层IP协议-CSDN博客 链路层以太网详解_以太网数据链路层-CSDN博客 二. Socket编程 Socket是…

智能运维场景 | 科技风险预警,能实现到什么程度?

[ 原作者:擎创夏洛克,本文略做了节选和改编 ] 每次一说到“风险预警”,就会有客户问我们能做怎样的风险预警。实际上在智能运维厂商来说,此风险非彼风险,不是能做银行的业务上的风险预警(比如贷款风险等&a…

Day 22 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大&#…

2024年CISP认证详细报考流程和条件,建议收藏!

CISP(Certified Information Security Professional,注册信息安全专业人员)证书是由中国信息安全测评中心(CNITSEC)颁发的专业资质证书,旨在为信息安全领域培养和认证具备一定专业水平的安全人才。CISP证书…

IDEA 导出jar无法执行 错误: 找不到或无法加载主类

1、首先配置正确Project Struct 保证需要引用的jar包库添加到Libraries里,尽管添加到Modules里依然可以测试运行或调试,但导出的jar包会遇到问题。 2、导出jar,方式选择如下 选择”From modules with dependencies" 然后去掉以上“Extr…