opencv-python常用函数解析及参数介绍(五)——腐蚀与膨胀

article/2025/8/28 23:11:49

腐蚀与膨胀

  • 前言
  • 膨胀
  • 腐蚀
  • 开运算与闭运算
  • 礼帽与黑帽
  • 运用膨胀和腐蚀获得图像轮廓

前言

有些时候图片上会有一些划痕或者污渍,会影响图片的质量,假设我有一张写有“艾醒”的图片,但是有花花绿绿的划痕和污渍,这时我们就可以运用腐蚀与膨胀消除这些划痕和污渍

膨胀

腐蚀的本质就是白吃黑,即数值较大的(较白的)吃掉数值较小的(较黑的)
我们可以用cv2.dilate进行膨胀,参数为图片,卷积核,膨胀次数
其原理就是在卷积核范围内,如果周围颜色浅的(数值较大的)多,那么当前点就应该是颜色浅的,否则应该是颜色深的
假设我们有一张图片名称为aixing.png
在这里插入图片描述

img = cv2.imread('aixing.png')
kernel = np.ones((5,5),np.uint8) 
dilate = cv2.dilate(dige_erosion,kernel,iterations = 3)cv2.imshow('dilate', dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们用5x5的卷积核来进行3次膨胀
在这里插入图片描述
可以看到虽然划痕和污渍几乎没有了,但是这个图片上的字比之前小不少,为了还原字的大小我们还需要进行腐蚀操作,注意腐蚀操作需要跟膨胀操作卷积核和执行次数相同才能还原之前的大小

腐蚀

腐蚀的本质就是黑吃白,即数值较小的(较黑的)吃掉数值较大的(较白的)
我们可以用cv2.erode进行腐蚀,参数为图片,卷积核,腐蚀次数
其原理就是在卷积核中,如果周围颜色深的(数值较小的)多,那么当前点就应该是颜色深的,否则应该是颜色浅的

我们进行腐蚀

kernel = np.ones((5,5),np.uint8) 
erosion = cv2.erode(dilate,kernel,iterations = 3)cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
现在我们可以看到划痕和污渍已经去掉了

开运算与闭运算

实际上这两个功能很鸡肋,开运算就是先腐蚀,再膨胀;闭运算就是先膨胀,再腐蚀
opencv中cv2.morphologyEx函数可以实现开闭运算,参数为图片,操作类型,卷积核
操作类型参数

cv2.MORPH_OPENcv2.MORPH_CLOSE
开运算闭运算

很明显,我们刚刚的问题需要进行闭运算

img = cv2.imread('aixing.png')kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

可以看到效果并不好,这是为什么呢,因为闭运算只进行了一次膨胀一次腐蚀,而我们得到的较好的结果是进行了3次膨胀和3次腐蚀

开运算的代码也放在这里,但要说明当前问题并不适合开运算,如果画面背景是偏深色的,我们需要侧重的部分或者文字是偏浅色的较为适合开运算,如果要尝试我们可以将图片反色,如何反色呢?令255减去图片就好了

img = cv2.imread('aixing.png')kernel = np.ones((5,5),np.uint8) 
reverse = 255 - img # 反色
cv2.imshow('opening', reverse)
cv2.waitKey(0)
cv2.destroyAllWindows()opening = cv2.morphologyEx(reverse, cv2.MORPH_OPEN, kernel)cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

可以看到效果也不好,所以这个函数了解即可。

礼帽与黑帽

没有什么需要解释的,了解下面的操作就可以了
礼帽 = 原始输入-开运算结果
黑帽 = 闭运算-原始输入

#礼帽
img = cv2.imread('aixing.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

#黑帽
img = cv2.imread('aixing.png')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

运用膨胀和腐蚀获得图像轮廓

假设我们有这样一个名为yan.jpg的岩元素图标
在这里插入图片描述
为了获取它的轮廓,我们先要将他二值化,即进行前几篇文章提到过的阈值操作,很显然我们应该选用cv2.THRESH_BINARY参数

yan = cv2.imread('yan.jpg', cv2.IMREAD_GRAYSCALE)
ret, img = cv2.threshold(yan, 220, 255, cv2.THRESH_BINARY)
cv_show(img, 'threshold')

在这里插入图片描述
然后分别进行一次膨胀和一次腐蚀

kernel = np.ones((5,5),np.uint8) 
dilate = cv2.dilate(img,kernel,iterations = 1)
erosion = cv2.erode(img,kernel,iterations = 1)res = np.hstack((dilate,erosion))cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
左侧是膨胀,右侧是腐蚀的结果
然后膨胀减去腐蚀

cv2.imshow('res', cv2.convertScaleAbs(dilate-erosion))
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

那么为什么是膨胀减腐蚀呢,因为膨胀的白色的区域多,白色的是非0值,所以实际上白色轮廓曾是膨胀后的一部分,但是这样得到的轮廓实际上比真实的轮廓要宽,因为膨胀会让轮廓向里扩展,腐蚀会让轮廓向外扩展
那么如何得到恰好的轮廓呢

真实的轮廓我们可以分为内轮廓和外轮廓
要得到内轮廓,我们只需膨胀减去膨胀前的图就好了

cv2.imshow('res', cv2.convertScaleAbs(dilate-img))
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
同样的,外轮廓可以通过腐蚀前的图像减去腐蚀后的图像得到

cv2.imshow('res', cv2.convertScaleAbs(img-erosion))
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

单独这样看也许并不明显,那么我们将他们画在一起来看对比
首先我们打开原图,我们将在原图上画轮廓

color_yan  = cv2.imread('yan.jpg')

我们要先获取索引来找到哪些点位需要轮廓

idx1, idx2 = np.where((dilate-erosion)!=0)
idx3, idx4 = np.where((img-erosion)!=0)
idx5, idx6 = np.where((dilate-img)!=0)

由于膨胀减去腐蚀的宽度正好可以被原图减腐蚀和膨胀减原图覆盖,即被外轮廓和内轮廓的和覆盖,所以我们分别展示膨胀减腐蚀与内轮廓和外轮廓的对比
与外轮廓的对比

color_yan[idx1, idx2,:] = (255, 0, 0)
color_yan[idx3, idx4,:] = (0, 255, 0)

蓝的是膨胀减去腐蚀的轮廓(下同),绿色的是外轮廓的效果
在这里插入图片描述
与内轮廓对比
红色的内轮廓的效果

color_yan  = cv2.imread('yan.jpg')
color_yan[idx1, idx2,:] = (255, 0, 0)
color_yan[idx5, idx6,:] = (0, 0, 255)

在这里插入图片描述


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

相关文章

OpenCV-Python教程:形态学变换~腐蚀和膨胀(erode,dilate)

原文链接:http://www.juzicode.com/opencv-python-erode-dilate 返回Opencv-Python教程 形态学变换是基于图像形状的变换过程,通常用来处理二值图像,当然也可以用在灰度图上。OpenCV中的形态学变换同平滑处理一样也是基于一种“滑动窗口”的…

计算机视觉开源库OpenCV之cv2.erode()和cv2.dilate()函数

cv2.erode()腐蚀:将前景物体变小,理解成将图像断开裂缝变大(在图片上画上黑色印记,印记越来越大) dst cv.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) cv2.dilate()膨胀&…

opencv-膨胀 dilate()

【功能】 膨胀是对白色部分(高亮部分)而言的,膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。 膨胀是结构元素反射的平移与处理的图像的交集不为空。(结构元素B 与 图像…

OpenCvSharp函数:Dilate膨胀、GetStructuringElement获取形态操作的结构元素、Erode腐蚀

Dilate膨胀 函数说明:用特定的结构元素膨胀图像。膨胀可以看成是最大值滤波,即用最大值替换中心像素点。该函数就地模式,可以指定迭代次数,多通道图像的话,每个通道分开处理。 用3x3矩形结构元素膨胀 //函数原型 void …

OpenCV学习十一:dilate、erode 膨胀及腐蚀

膨胀及腐蚀,函数很简单,就写了个Demo 定义: 膨胀---图像膨胀的过程类似于一个卷积的过程,假设有图像矩阵A以及结构元素B(注意,B的形状、尺寸没有限制),B在A矩阵上依次移动&#xf…

OpenCV之图像膨胀:dilate函数(C++实现)

dilate函数是使用像素邻域内的局部极大运算符来膨胀图像。 函数原型: void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchorPoint(-1, -1), int iterations1, int borderTypeBORDER_CONSTANT, const Scalar& borderValuemorphology…

【Opencv--形态学操作】膨胀、腐蚀、开/闭操作:cv2.morphologyEx、cv2.erode、cv2.dilate

【Opencv–形态学操作】膨胀、腐蚀、开/闭操作 文章目录 【Opencv--形态学操作】膨胀、腐蚀、开/闭操作1. 介绍2. 形态学操作2.1 腐蚀和膨胀2.1.1 腐蚀2.1.2 膨胀2.1.3 代码示例 2.2 开/闭操作2.2.1 开操作2.2.2 闭操作2.2.3 代码示例 2.3 礼帽和黑帽2.3.1 礼帽运算2.3.2 黑帽运…

opencv 图像腐蚀膨胀 erode dilate

#include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dstbin, distancetransform,rel, rel2;img imread("m3.jpg");//转为灰度图cvtColor(img, dst, COLOR_BGR2GRAY);//二…

dilate函数

dilate函数 函数的调用形式: void dilate ( InputArray src , OutputArray dst , InputArray kernel , Point anchor Point(-1,-1), int iterations 1, int borderType BORDER_CONSTANT, const Scalar& borderValue morphologyDefaultBorderValue() ) 函…

opencv形态学运算:腐蚀(erode)和膨胀(dilate)

形态学操作就是基于形状的一系列图像处理操作。OpenCV为进行图像的形态学变换提供了快捷、方便的函数。最基本的形态学操作有二种,他们是:膨胀与腐蚀(Dilation与Erosion)。 膨胀与腐蚀能实现多种多样的功能,主要如下: 消除噪声分…

C++ 膨胀与腐蚀(dilate、erode)

参考:https://blog.csdn.net/poem_qianmo/article/details/23710721 膨胀: 函数:一般只需输前三个参数:输入图像、输出图像、卷积内核 void dilate( InputArray src, OutputArray dst, InputArray kernel, Po…

PYTORCH 笔记 DILATE 代码解读

dilate 完整代码路径:vincent-leguen/DILATE: Code for our NeurIPS 2019 paper "Shape and Time Distortion Loss for Training Deep Time Series Forecasting Models" (github.com) 1 main 函数 1.1 导入库 import numpy as np import torch from da…

Opencv中的erode和dilate(腐蚀和膨胀-python实现)

文章目录 1.腐蚀原理(1)具体实现过程(2).函数讲解 (3).代码实战2.膨胀原理(1)具体实现过程(2)函数讲解(3)代码实现 1.腐蚀原理 &…

OpenCV-Python腐蚀膨胀函数erode、dilate使用详解

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一、引言 在《OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍:https://blog.csdn.net/LaoYuanPython/article/details/109441709》介绍了图像腐蚀和膨胀的基本原理&a…

OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一、引言 关于图像的腐蚀和膨胀,网上介绍的资料非常多,老猿也看了很多,总体来说主要偏向于就使用OpenCV腐蚀和膨胀函数的应用,另外原理介绍的有一小部分&#…

opencv之dilate()函数

概述 dilate()函数可以对输入图像用特定结构元素进行膨胀操作,该结构元素确定膨胀操作过程中的邻域的形状,各点像素值将被替换为对应邻域上的最大值: API说明 C++ API: void cv::dilate(InputArraysrc,(原始图像:通道数不限,depth必须是CV_8U,CV_16U,CV_16S,CV_…

OpenCV-膨胀cv::dilate

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 原理 形态学是图像处理中常见的名词,图像处理的形态学基本属于数学形态学的范畴,是一门建立在格论和拓扑…

【图像处理】腐蚀(erode)和膨胀(dilate)

【图像处理】腐蚀(erode)和膨胀(dilate) 原理腐蚀(erode)膨胀(dilate) OpenCV实现C实现python实现 开运算(Opening Operation)闭运算(Closing Ope…

chatgpt赋能Python-python_dilate

Python中的dilate操作:了解该操作及其应用 在计算机视觉领域,dilate操作是一种常用的图像处理技术。在Python中,我们可以使用OpenCV库来实现dilate操作。本文将介绍dilate操作的基本概念,讨论其应用及如何使用Python进行实现。 …

OPenCV膨胀函数dilate()的使用

OPenCV版本:4.4 IDE:VS2017 功能描述 简述:使用一个指定的核元素去膨胀一个图像,图像膨胀的过程类似于一个卷积的过程,源图像矩阵A以及结构元素B,B在A矩阵上依次移动,每个位置上B所覆盖元素的最…