python --opencv图像处理形态学(开运算、闭运算、梯度运算、顶帽运算、黑帽运算)

article/2025/10/3 16:26:43

引言

前面介绍了图像形态学的两种基础算法,图像腐蚀和图像膨胀,本篇接着介绍图像形态学中的开运算、闭运算以及梯度运算。
需要了解清楚图像的腐蚀与膨胀基础原理,不然真的没办法理解开运算和闭运算。

第一件事情还是给图像增加噪声,思路沿用之前加噪声的思路,使用 Numpy 给图片添加黑白两种噪声点,代码如下

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 读取图片
img = cv.imread("demo.png", cv.IMREAD_UNCHANGED)
source = cv.cvtColor(img, cv.COLOR_BGR2RGB)
rows, cols, chn = source.shape# 加噪声-白点噪声
for i in range(500):x = np.random.randint(0, rows)y = np.random.randint(0, cols)source[x, y, :] = 255# 图像保存 白点噪声图像
cv.imwrite("demo_noise_white.jpg", source)
print("白点噪声添加完成")# 重新读取图像
img1 = cv.imread("demo.png", cv.IMREAD_UNCHANGED)
source1 = cv.cvtColor(img1, cv.COLOR_BGR2RGB)# 加噪声-黑点噪声
for i in range(1000):x = np.random.randint(0, rows)y = np.random.randint(0, cols)source1[x, y, :] = 0# 图像保存 黑点噪声图像
cv.imwrite("demo_noise_black.jpg", source1)
print("黑点噪声添加完成")# 显示结果
titles = ['White Img','Black Img']
images = [source, source1]# matplotlib 绘图
for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

在这里插入图片描述

开运算

图像开运算实际上是一个组合运算,开运算是图像先进行腐蚀,再进行膨胀的运算。

图像被腐蚀后,去除了噪声,但是也压缩了图像;接着对腐蚀过的图像进行膨胀处理,使得刚才在腐蚀过程中被压缩的图像得以恢复原状。

下面是一个图像开运算的流程图:
在这里插入图片描述

开运算的一些特性:

  • 开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不便。
  • 开运算是一个基于几何运算的滤波器。
  • 结构元素大小的不同将导致滤波效果的不同。
  • 不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
  • 我们先不管开运算 OpenCV 为我们提供的函数是什么,先使用前面介绍过的图像腐蚀与膨胀处理看下结果

案例:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 读取图片
source = cv.imread("demo_noise_white.jpg", cv.IMREAD_GRAYSCALE)# 设置卷积核
kernel = np.ones((5, 5),np.uint8)# 图像腐蚀
erode_img = cv.erode(source, kernel)# 图像膨胀
dilate_result = cv.dilate(erode_img, kernel)# 显示结果
titles = ['Source Img','Erode Img','Dilate Img']
images = [source, erode_img, dilate_result]# matplotlib 绘图
for i in range(3):plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

在这里插入图片描述
可以看到降噪的效果还是不错的。

接着看 OpenCV 为开运算提供的函数。

图像开运算主要使用到的函数是 morphologyEx() 它是形态学扩展的一组函数,而其中的 cv.MORPH_OPEN 对应的是开运算。

使用时语法如下:

dst = cv.morphologyEx(src, cv.MORPH_OPEN, kernel)
  • src:原图形
  • cv2.MORPH_OPEN:表示开运算
  • kernel:卷积核

我们再使用 morphologyEx() 函数去重新实现下刚才的图像开运算,看下和之前的结果有啥区别:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 读取图片
source = cv.imread("demo_noise_white.jpg", cv.IMREAD_GRAYSCALE)# 设置卷积核
kernel = np.ones((5, 5),np.uint8)#图像开运算
dst = cv.morphologyEx(source, cv.MORPH_OPEN, kernel)# 显示结果
titles = ['Source Img','Dst Img']
images = [source, dst]# matplotlib 绘图
for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

在这里插入图片描述
至少从肉眼的角度上看不出来和之前的方式有啥区别,实际上也没啥区别。

闭运算

与开运算相反的是闭运算,闭运算是图像先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。

先看下图像闭运算的流程图:

在这里插入图片描述

闭运算的一些特性:

  • 闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
  • 闭运算是通过填充图像的凹角来滤波图像的。
  • 结构元素大小的不同将导致滤波效果的不同。
  • 不同结构元素的选择导致了不同的分割。

首先还是用 dilate()erode() 函数实现一下图像闭运算,代码如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 读取图片
source = cv.imread("demo_noise_black.jpg", cv.IMREAD_GRAYSCALE)# 设置卷积核
kernel = np.ones((5, 5),np.uint8)# 图像膨胀
dilate_result = cv.dilate(source, kernel)# 图像腐蚀
erode_img = cv.erode(dilate_result, kernel)# 显示结果
titles = ['Source Img','Dilate Img','Erode Img']
images = [source, dilate_result, erode_img]# matplotlib 绘图
for i in range(3):plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

在这里插入图片描述
如果想要使用形态学扩展的函数 morphologyEx() 则需要把里面的参数换成 MORPH_CLOSE ,同样,既然是形态学扩展函数,那么图像腐蚀和图像膨胀也有对应的参数:

  • 图像腐蚀:MORPH_ERODE
  • 图像膨胀:MORPH_DILATE

接着还是使用 MORPH_CLOSE 参数来实现下图像的闭运算:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 读取图片
source = cv.imread("demo_noise_black.jpg", cv.IMREAD_GRAYSCALE)# 设置卷积核
kernel = np.ones((5, 5),np.uint8)# 图像闭运算
dst = cv.morphologyEx(source, cv.MORPH_CLOSE, kernel)# 显示结果
titles = ['Source Img','Dst Img']
images = [source, dst]# matplotlib 绘图
for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

在这里插入图片描述

梯度运算

图像形态学的梯度运算和前面的开运算闭运算是一样的,都是组合函数。

梯度运算实际上是图像膨胀减去图像腐蚀后的结果,最终我们得到的是一个类似于图像轮廓的图形。
在这里插入图片描述
梯度运算在 morphologyEx() 函数中的参数是 MORPH_GRADIENT ,示例代码如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 读取图片
source = cv.imread("demo.png", cv.IMREAD_GRAYSCALE)# 设置卷积核
kernel = np.ones((5, 5), np.uint8)# 图像梯度运算
dst = cv.morphologyEx(source, cv.MORPH_GRADIENT, kernel)# 显示结果
titles = ['Source Img','Dst Img']
images = [source, dst]# matplotlib 绘图
for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

在这里插入图片描述

顶帽运算

图像处理顶帽运算是一个获取图像噪声的运算,它是由原始图像减去图像开运算而得到的结果:

顶帽运算 = 原始图像 - 开运算

在这里插入图片描述
图像顶帽运算同样是使用形态学扩展函数 morphologyEx() ,它的参数是 MORPH_TOPHAT ,示例如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 读取图片
source = cv.imread("demo_noise_white.jpg", cv.IMREAD_GRAYSCALE)# 设置卷积核
kernel = np.ones((5, 5), np.uint8)# 开运算
open = cv.morphologyEx(source, cv.MORPH_OPEN, kernel)# 顶帽运算
dst = cv.morphologyEx(source, cv.MORPH_TOPHAT, kernel)# 显示结果
titles = ['Source Img','Open Img', 'Tophat Img']
images = [source, open, dst]# matplotlib 绘图
for i in range(3):plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

在这里插入图片描述

黑帽运算

图像处理顶帽运算是一个获取图像内部的小孔,或者前景色中的小黑点的运算。

它是由图像闭运算减去原始图像的操作:

黑帽运算 = 闭运算图像 - 原始图像

在这里插入图片描述

图像顶帽运算同样是使用形态学扩展函数 morphologyEx() ,它的参数是 MORPH_BLACKHAT ,示例如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 读取图片
source = cv.imread("demo_noise_black.jpg", cv.IMREAD_GRAYSCALE)# 设置卷积核
kernel = np.ones((5, 5), np.uint8)# 黑帽运算
dst = cv.morphologyEx(source, cv.MORPH_BLACKHAT, kernel)# 构造显示结果数组
titles = ['Source Img', 'Black Img']
images = [source, dst]# matplotlib 绘图
for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

在这里插入图片描述


http://chatgpt.dhexx.cn/article/OwdLIXti.shtml

相关文章

二值图像开闭运算matlab,【数字图像处理】图像开运算与闭运算

图像开启与闭合 图像开运算与闭运算与膨胀和腐蚀运算有关,由膨胀和腐蚀两个运算的复合与集合操作(并、交、补等)组合成的所以运算构成。 开运算与闭运算依据腐蚀和膨胀的不可逆性,演变而来。 开运算:先对图像腐蚀后膨胀 闭运算:先…

OpenCV之开运算与闭运算

1.开运算:先腐蚀,后膨胀 开运算总结: (1)开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不便。 (2)开运算是一个基于几何运算的滤波器。…

halcon 开运算与闭运算

例一:毛刺在往外凸的面上 策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域。 1 read_image (Tu, C:/Users/xiahui/Desktop/tu.jpg) 2 binary_threshold …

图像开运算

开运算是先腐蚀后膨胀的过程,它能去除孤点、毛刺和小桥(连接两区域的小点),消除小物体、平滑大物体的边界,并且不明显改变面积。 开运算公式如下: #include"cv.h" #include "highgui.h&…

8.3 开运算

点击此处返回总目录 一、什么是开运算 一个图像先进行腐蚀,再进行膨胀。 这种操作,最后得到的图像就是对原始图像的去燥处理。并保持原有图像的形状不变。 这种操作叫做开运算。 官网上的例子&#xff…

形态学应用——图像开运算与闭运算

(如果不了解腐蚀与膨胀原理的同学那请看我前一期博客哦!) 1.开运算 开运算 先腐蚀运算,再膨胀运算(看上去把细微连在一起的两块目标分开了) 开运算的效果图如下图所示: 开运算总结&#xf…

20、开运算与闭运算

一、开运算含义 先进行腐蚀再进行膨胀就叫做开运算。开运算 (image) 膨胀 (腐蚀 (image)) 图像被腐蚀后,去除了噪声,但会压缩图像;对腐蚀过的图像进行膨胀处理,可以去除噪声并保持原有形状。 二、morphologyEx() 实现开运算 2…

形态学操作——开运算与闭运算

1.开运算 开运算 先腐蚀运算,再膨胀运算(看上去把细微连在一起的两块目标分开了) 开运算的效果图如下图所示: 开运算总结: (1)开运算能够除去孤立的小点,毛刺和小桥&am…

形态学 - 开运算和闭运算

目录 1. 介绍 2. 代码实现 2.1 开运算 2.2 闭运算 1. 介绍 膨胀和腐蚀操作都会有一个通病,就是会改变原目标的大小 开运算:先对目标腐蚀在膨胀 开运算能够平滑物体的轮廓、断开狭窄的狭颈、消除细长的突出物等等 开运算的一些理解:先…

RNN流程详解

RNN及其代码流程 本文重点关注RNN的 整个流程,而不是BP的推导过程 什么是RNN Recurrent Neural Network 循环神经网络 为什么需要RNN? 普通的神经网络都只能单独地处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是&#…

微信小程序:如何在{{}}中使用函数?WXML+WXS

前言 在项目中涉及到百分比的计算&#xff0c;js浮点数运算会出现精度问题&#xff0c;造成小数位数过多&#xff0c;因此想在模板语法中对值进行相应的处理。 开始 按照常规用法&#xff0c;使用js中的toFixed()进行处理&#xff1a; <view>&#xffe5;{{(cashMone…

wxPython:wx.Font详细解释用法

官方构造解释&#xff1a; 注解用法&#xff1a; wx.Font(pointSize, family, style, weight, underlineFalse, faceName"", encodingFONTENCODING_DEFAULT) pointSize &#xff1a;文字大小&#xff1a;floatfamily &#xff1a;字体系列&#xff1a;FontFamilyst…

小程序 - wxs

wxs&#xff1a; 在小程序里写函数表达式&#xff0c;做数据处理 官方文档 wxs WXS&#xff08;WeiXin Script&#xff09;是小程序的一套脚本语言&#xff0c;结合 WXML&#xff0c;可以构建出页面的结构。 WXS 与 JavaScript 是不同的语言&#xff0c;有自己的语法&#x…

如何在小程序的wxml中书写函数逻辑,wxs的使用

在小程序wxml的页面中我们可以使用{{}}内部来书写简单的js表达式&#xff0c;如三目运算符等&#xff0c;但是对于稍微复杂一点的逻辑我们就需要用函数来解决&#xff0c;如果写在js文件中有些繁琐还需要绑定数据等&#xff0c;此时wxs就配上了用场 wxs只支持ES5&#xff01;&…

【学习】HW5

机器学习/深度学习 一、HW5任务训练数据集评价指标——BLEU工作流程训练技巧Baseline Guidereport 代码数据集迭代器编码器attention解码器Seq2Seq模型初始化优化优化器&#xff1a;Adamlr scheduling验证和推断模型补充 一、HW5 任务 在这个家庭作业中&#xff0c;我们将把英…

WXSS-WXML-WXS语法

目录&#xff1a; 1 WXSS编写程序样式 2 Mustache语法绑定 3 WXML的条件渲染 4 WXML的列表渲染 5 WXS语法基本使用 6 WXS语法案例练习 小程序的自适应单位rpx。在设计稿为iPhone6的时候1px2rpx wxml必须是闭合标签&#xff0c;或者单标签加/&#xff0c;否则会报错&#…

WX:用法

1.条件渲染wx:for 在组件上绑定一个数组&#xff08;默认当前标下变量为index.数组变量为item) wx:for-item可以指定当前元素的变量名 wx:for-index可以指定数组当前下标的变量名 2.条件渲染wx:if wx:if是一个控制属性&#xff0c;需要添加到标签中使用 使用多个标签时可…

【微信小程序】WXML WXSS JS

目录 &#x1f353;小程序代码的构成 - WXML 模板 1. 什么是 WXML 2. WXML 和 HTML 的区别 &#x1f347;小程序代码的构成 - WXSS 样式 1. 什么是 WXSS 2. WXSS 和 CSS 的区别 &#x1f352;小程序代码的构成 - JS 逻辑交互 1. 小程序中的 .js 文件 2. 小程序中 .js 文…

【HW4】

HW4 一、Unsupervised LearningSharing ParametersFormulationIn PracticeVarious ArchitecturesApplication机器翻译 总结 二、HW41、Task2、数据集分析mapping.json文件metadata.json文件testdata.json文件 3、Dataset 4、Dataloader5、Model6、Learning rate scheduleLambda…

【微信小程序】--WXML WXSS JS 逻辑交互介绍(四)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…