Opencv中的开运算和闭运算操作讲解(python实现)

article/2025/10/3 15:52:39

文章目录

    • 1.首先了解腐蚀和膨胀原理
    • 2.开运算
      • (1)为什么开运算可以去白噪点呢?
      • (2).函数讲解
      • (3)代码实战
    • 3.闭运算
      • (1)函数讲解
      • (2)代码实战

1.首先了解腐蚀和膨胀原理

https://mydreamambitious.blog.csdn.net/article/details/125265431


2.开运算

开运算=腐蚀+膨胀(顺序不可颠倒)

(1)为什么开运算可以去白噪点呢?

根据腐蚀的原理,使用一个给定大小的卷积核(结构单元)对图像进行卷积,操作是用卷积核(结构元素)B与其覆盖的二值图像A做“与”操作,如果结果为1,那么为1,否则为0;但是对于噪点的话,很多情况下在于卷积核进行与操作之后结果都为0,所以对于二值图像那么就是黑色,也就是白色的噪点变成黑色(相当于白色噪点被去掉)。腐蚀之后图像中的主要部分也会变小(“瘦”),所以需要使用膨胀进行还原;膨胀的过程是使用卷积核与二值图像进行或操作,只要其中有一个为1,则结果为1,否则结果为0.从而达到了去白噪点。
比如下面一张图中,可以看到其中有很多的白色噪点,所以这个时候可以使用开运算操作。

在这里插入图片描述

(2).函数讲解

morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):

Src:输入的原始图像
Op:进行操作(开运算或者闭运算)
Kernel:卷积核的大小
Dst:输出的图像
Anchor:默认值为(-1,-1),卷积的中心
Iterations:迭代的次数
borderType:用于推断图像外部像素的某种边界模式。注意它有默认值 BORDER_DEFAULT
borderValue:边界值(如果是常量边界)。默认morphologyDefaultBorderValue具有特殊含义。对于侵蚀,它被转换为+\inf;对于膨胀,它被转换为-\inf,这意味着只有在图像内部的像素上才能有效地计算最小值(最大值)

(3)代码实战

import os
import cv2
import random
import numpy as np#产生白色噪点
def ProduceWhiteNoise(img_path='images/Exen.png'):image=cv2.imread(img_path)h,w,c=np.shape(image)noise=np.zeros(shape=image.shape,dtype=np.uint8)# print(np.shape(image))#固定产生白噪点的个数count=0prob=0.95for i in range(h):for j in range(w):sand=random.random()if count<=50000 and sand>prob:noise[i][j]=255count+=1else:noise[i][j]=image[i][j]cv2.imshow('image',noise)cv2.waitKey(0)cv2.imwrite('images/Exen_copy.png',noise)#进行开运算的方式一,直接调用开运算函数
def MorphologyExAnd(img_path='images/Exen_copy.png'):#读取图片img_src=cv2.imread(img_path)img=cv2.resize(src=img_src,dsize=(500,500))#获取卷积核,这里使用矩阵的方式kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(7,7))#进行开运算img=cv2.morphologyEx(src=img,op=cv2.MORPH_OPEN,kernel=kernel,iterations=1)#显示图片cv2.imshow('img_src',img_src)cv2.imshow('img',img)#等待接收鼠标或者键值cv2.waitKey(0)cv2.destroyAllWindows()#进行开运算方式2=腐蚀+膨胀
def Erode_Dilate(img_path='images/Exen_copy.png'):#读取图像img_src=cv2.imread(img_path)img=cv2.resize(src=img_src,dsize=(500,500))#获取卷积核kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(7,7))#首先进行腐蚀操作img_erode=cv2.erode(src=img,kernel=kernel,iterations=2)#再进行膨胀操作img_dilate=cv2.dilate(src=img_erode,kernel=kernel,iterations=2)#显示图像cv2.imshow('img_src',img_src)cv2.imshow('img_dilate',img_dilate)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':print('Pycharm')# ProduceWhiteNoise()# MorphologyExAnd()Erode_Dilate()

直接调用开运算操作的结果
在这里插入图片描述
使用:腐蚀+膨胀方式
在这里插入图片描述
可以看到两者的效果都是很不错的。


3.闭运算

闭运算=膨胀+腐蚀
(和开运算相反)
达到的效果:
比如下面一张图中,可以看到其中有很多的黑色噪点,所以这个时候可以使用开运算操作。

在这里插入图片描述

(1)函数讲解

和开运算一样的函数,只不过op的方式改为:cv2.MORPH_CLOSE

(2)代码实战

import os
import cv2
import random
import numpy as np#产生黑色噪点
def ProduceBlackNoise(img_path='images/Exen.png'):image=cv2.imread(img_path)h,w,c=np.shape(image)noise=np.zeros(shape=image.shape,dtype=np.uint8)# print(np.shape(image))#固定产生白噪点的个数count=0prob=0.95for i in range(h):for j in range(w):sand=random.random()if count<=50000 and sand>prob:noise[i][j]=0count+=1else:noise[i][j]=image[i][j]cv2.imshow('image',noise)cv2.waitKey(0)cv2.imwrite('images/Exen_black.png',noise)#进行开运算的方式一,直接调用开运算函数
def MorphologyExAnd(img_path='images/Exen_black.png'):#读取图片img_src=cv2.imread(img_path)img=cv2.resize(src=img_src,dsize=(500,500))#获取卷积核,这里使用矩阵的方式kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(3,3))#进行闭运算img=cv2.morphologyEx(src=img,op=cv2.MORPH_CLOSE,kernel=kernel,iterations=1)#显示图片cv2.imshow('img_src',img_src)cv2.imshow('img',img)#等待接收鼠标或者键值cv2.waitKey(0)cv2.destroyAllWindows()#进行开运算方式2=腐蚀+膨胀
def Erode_Dilate(img_path='images/Exen_black.png'):#读取图像img_src=cv2.imread(img_path)img=cv2.resize(src=img_src,dsize=(500,500))#获取卷积核kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(3,3))#首先进行膨胀操作img_dilate = cv2.dilate(src=img, kernel=kernel, iterations=1)#再进行腐蚀操作img_erode = cv2.erode(src=img_dilate, kernel=kernel, iterations=1)#显示图像cv2.imshow('img_src',img_src)cv2.imshow('img_dilate',img_erode)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':print('Pycharm')# ProduceBlackNoise()# MorphologyExAnd()Erode_Dilate()

直接使用闭运算函数的结果:
在这里插入图片描述
使用:膨胀+腐蚀方式
在这里插入图片描述
总结:
开运算是解决黑色图像部分中的白色噪点;
闭运算解决的是白色图像部分中的黑色噪点。


http://chatgpt.dhexx.cn/article/8O9CpO5g.shtml

相关文章

膨胀 腐蚀 开运算 闭运算 matlab,11. 形态学膨胀、腐蚀、开运算、闭运算

1. 膨胀:对边界点进行扩充,填充空洞,使边界向外部扩张的过程。 2. 腐蚀:消除物体边界点,使边界向内部收缩的过程,把小于结构元素的物体去除掉。 3. 开运算: 先腐蚀后膨胀的过程称为开运算,作用:去除孤立的小点,毛刺,消除小物体,平滑较大物体边界,同时不改变其面积。 4. 闭…

开运算、闭运算及其所用

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

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

引言 前面介绍了图像形态学的两种基础算法&#xff0c;图像腐蚀和图像膨胀&#xff0c;本篇接着介绍图像形态学中的开运算、闭运算以及梯度运算。 需要了解清楚图像的腐蚀与膨胀基础原理,不然真的没办法理解开运算和闭运算。 第一件事情还是给图像增加噪声&#xff0c;思路沿…

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

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

OpenCV之开运算与闭运算

1.开运算&#xff1a;先腐蚀&#xff0c;后膨胀 开运算总结&#xff1a; &#xff08;&#xff11;&#xff09;开运算能够除去孤立的小点&#xff0c;毛刺和小桥&#xff0c;而总的位置和形状不便。 &#xff08;&#xff12;&#xff09;开运算是一个基于几何运算的滤波器。…

halcon 开运算与闭运算

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

图像开运算

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

8.3 开运算

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

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

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

20、开运算与闭运算

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

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

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

形态学 - 开运算和闭运算

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

RNN流程详解

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

微信小程序:如何在{{}}中使用函数?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;需要添加到标签中使用 使用多个标签时可…