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

article/2025/8/29 5:30:41

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░

一、引言

在《OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍:https://blog.csdn.net/LaoYuanPython/article/details/109441709》介绍了图像腐蚀和膨胀的基本原理,以及OpenCV-Python对应函数erode、dilate的语法以及简单应用。

本节我们准备通过代码验证介绍一些关于OpenCV-Python对应函数erode、dilate一点比较细节和冷门的知识。

本文是老猿关于图像腐蚀与膨胀系列博文之一,该系列包括如下博文:

  1. OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍:https://blog.csdn.net/LaoYuanPython/article/details/109441709
  2. OpenCV-Python腐蚀膨胀函数erode、dilate使用详解:https://blog.csdn.net/LaoYuanPython/article/details/109477130
  3. OpenCV-Python图像矩阵不扩充边界腐蚀膨胀函数处理算法探究:https://blog.csdn.net/LaoYuanPython/article/details/109283825
  4. OpenCV图像腐蚀膨胀算法的Python模拟实现:
    https://blog.csdn.net/LaoYuanPython/article/details/109407091

二、准备

2.1、测试函数准备

为了进行相关验证,老猿准备了如下两个函数用于输出矩阵数据以及进行矩阵内容是否相同比较:

2.1.1、矩阵输出函数print2DMatrix

print2DMatrix用于输出2阶矩阵的每个元素,每列元素间用Tab键隔开,可以很方便地将数据拷贝到excel中使用:

def print2DMatrix(matrix):"""将2阶矩阵按照行和列方式打印输出每个元素:param matrix: 需要打印的矩阵:return: None"""if len(matrix.shape)!=2:print("只能输出二阶矩阵的信息,传入实参不是二阶矩阵,退出!")return Nonex,y = matrix.shapefor i in range(x):print(" ")for j in range(y):if matrix[i][j]==np.NaN:print(f' NAN',end=' ')if matrix.dtype in(np.uint8,np.uint,np.uint16,np.uint32):print(f'{matrix[i][j]:4d}',end='\t')else:print(f'{matrix[i][j]:4f}',end='\t')print("\n")

2.1.2、矩阵相等判断函数cmpMatrix

cmpMatrix函数用于比较两个矩阵的内容是否完全一致,如果是输出True,否则输出False。

def cmpMatrix(m1,m2):if m1.shape!=m2.shape:return FalsecmpM = m1==m2return cmpM.all()

2.2、处理素材准备

2.2.1、测试使用图片

图片文件名为pictures.png,图片内包含了多个OpenCV处理的经典图片,每张图片从1-13进行了编号,如下:
在这里插入图片描述
上述图片中,除了7号和8号图片的噪点外,3号图片增加了彩色噪点,在9号图片中加了两种不同颜色噪点、11号图片靠近左上角加了黑色噪点、13号图片靠近左下位置加了白色噪点。

2.2.2、测试小矩阵准备

除了使用图片测试外,还准备了一个10*10的小矩阵进行测试,便于输出数据查看。该矩阵的生成方法如下:

img = np.zeros((10, 10),np.uint8)for row in range(10):for col in range(10):img[row,col] = row*col

三、关于核矩阵的问题

3.1、核矩阵形状问题

3.1.1、具体问题
  1. 在网上看到的关于膨胀和腐蚀的介绍的文章,用到的核矩阵都是长和宽相等的正方形,那么核矩阵是否必须为正方形?
  2. 在《数字图像处理:理解什么是卷积(滤波)、卷积核以及相关参考资料》中介绍“卷积核的大小应该是奇数,这样它才有一个中心”,腐蚀和膨胀函数中的核矩阵是否必须是奇数大小?
3.1.2、验证

用代码生成一个长方形的长和宽都为偶数的核矩阵,然后对图像矩阵进行腐蚀和膨胀处理,看程序是否正常运行。

对应代码如下

def kernalTest():#测试腐蚀和膨胀的核的作用函数imgMatrix = cv2.imread(r'F:\pic\pictures.png', cv2.IMREAD_GRAYSCALE) #读入图片转成灰度图像矩阵imgMatrix#构造小矩阵littleMatrixlittleMatrix = np.zeros((10, 10), np.uint8)for row in range(10):for col in range(10):littleMatrix[row, col] = row * colkernal64 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(6, 4))imgErode = cv2.erode(littleMatrix, kernal64,  borderType=cv2.BORDER_CONSTANT, borderValue=0)imgDilate = cv2.dilate(littleMatrix, kernal64,  borderType=cv2.BORDER_CONSTANT, borderValue=0)print("kernal64矩阵内容:")print2DMatrix(kernal64)print("littleMatrix小矩阵数据如下:")print2DMatrix(littleMatrix)print("littleMatrix小矩阵腐蚀后结果数据如下:")print2DMatrix(imgErode)print("littleMatrix小矩阵膨胀后结果数据如下:")print2DMatrix(imgDilate)imgErode = cv2.erode(imgMatrix, kernal64, borderType=cv2.BORDER_CONSTANT, borderValue=0)imgDilate = cv2.dilate(imgMatrix, kernal64, borderType=cv2.BORDER_CONSTANT, borderValue=0)cv2.imshow('imgErode', imgErode)cv2.imshow('imgDilate', imgDilate)cv2.waitKey(0)cv2.destroyAllWindows()kernalTest()

程序执行打印输出内容如下:

kernal64矩阵内容:0	   0	   0	   1	   0	   0	 1	   1	   1	   1	   1	   1	 1	   1	   1	   1	   1	   1	 1	   1	   1	   1	   1	   1	littleMatrix小矩阵数据如下:0	   0	   0	   0	   0	   0	   0	   0	   0	   0	 0	   1	   2	   3	   4	   5	   6	   7	   8	   9	 0	   2	   4	   6	   8	  10	  12	  14	  16	  18	 0	   3	   6	   9	  12	  15	  18	  21	  24	  27	 0	   4	   8	  12	  16	  20	  24	  28	  32	  36	 0	   5	  10	  15	  20	  25	  30	  35	  40	  45	 0	   6	  12	  18	  24	  30	  36	  42	  48	  54	 0	   7	  14	  21	  28	  35	  42	  49	  56	  63	 0	   8	  16	  24	  32	  40	  48	  56	  64	  72	 0	   9	  18	  27	  36	  45	  54	  63	  72	  81	littleMatrix小矩阵腐蚀后结果数据如下:0	   0	   0	   0	   0	   0	   0	   0	   0	   0	 0	   0	   0	   0	   0	   0	   0	   0	   0	   0	 0	   0	   0	   0	   0	   0	   0	   0	   0	   0	 0	   0	   0	   0	   2	   4	   6	   7	   0	   0	 0	   0	   0	   0	   3	   6	   9	  12	   0	   0	 0	   0	   0	   0	   4	   8	  12	  16	   0	   0	 0	   0	   0	   0	   5	  10	  15	  20	   0	   0	 0	   0	   0	   0	   6	  12	  18	  24	   0	   0	 0	   0	   0	   0	   7	  14	  21	  28	   0	   0	 0	   0	   0	   0	   0	   0	   0	   0	   0	   0	littleMatrix小矩阵膨胀后结果数据如下:2	   3	   4	   5	   6	   7	   8	   9	   9	   9	 4	   6	   8	  10	  12	  14	  16	  18	  18	  18	 6	   9	  12	  15	  18	  21	  24	  27	  27	  27	 8	  12	  16	  20	  24	  28	  32	  36	  36	  36	 10	  15	  20	  25	  30	  35	  40	  45	  45	  45	 12	  18	  24	  30	  36	  42	  48	  54	  54	  54	 14	  21	  28	  35	  42	  49	  56	  63	  63	  63	 16	  24	  32	  40	  48	  56	  64	  72	  72	  72	 18	  27	  36	  45	  54	  63	  72	  81	  81	  81	 18	  27	  36	  45	  54	  63	  72	  81	  81	  81

从上面输出内容可以看出,核矩阵第1行第4列值为1,为内接椭圆顶点,因此也是默认中心点的横坐标,值为3=6/2,按此推测,则默认中心点为(3,2),以此核实相关结果矩阵数据,与输出结果相同。

除了输出小矩阵的腐蚀情况数据,程序还输出了图像矩阵的截图,其中腐蚀后图像如下:
在这里插入图片描述
可以看到原图对应灰度图腐蚀后,除了常规的亮度区域变小黑色区域变大外,3号图片噪点增大,7号、9号、13号图片噪点消失,11号图片黑色噪点扩大。

图片膨胀后结果图像如下:
在这里插入图片描述
可以看到原图对应灰度图膨胀后,除了亮度区域变大黑色区域变小外,3号图片噪点基本消失,7号、9号、13号图片噪点扩大,11号图片黑色噪点消失。

3.1.3、结论

经上述代码验证,核矩阵为长方形且长和宽为偶数情况下,腐蚀和膨胀都能正常执行。

3.2、核矩阵元素值相关问题

3.2.1、具体问题
  1. getStructuringElement函数生成的核矩阵元素全为0或1,该矩阵元素的类型是什么?核矩阵是否允许非0或1的数据甚至浮点数?
  2. 在《数字图像处理:理解什么是卷积(滤波)、卷积核以及相关参考资料》中介绍卷积运算是将源图像矩阵和核相乘后再相加,而腐蚀和膨胀是取核矩阵不为0部分对应源矩阵的最小值或最大值作为腐蚀或膨胀的结果。验证一下是否确实腐蚀和膨胀无需源矩阵和核矩阵相乘再取最小值或最大值。
3.2.2、验证

用代码生成一个3*3的数据为浮点数的核矩阵,然后对图像矩阵进行腐蚀和膨胀处理,看程序是否正常运行。

对应代码如下

def kernalTest():#测试腐蚀和膨胀的核的作用函数littleMatrix = np.zeros((10, 10), np.uint8)for row in range(10):for col in range(10):littleMatrix[row, col] = row * colkernal33 = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))kernal33Float = kernal33.astype(np.float32)*0.1print(f"kernal33矩阵元素类型为:{kernal33.dtype},数据内容如下:")print2DMatrix(kernal33)print(f"kernal33Float矩阵元素类型为:{kernal33Float.dtype},数据内容如下:")print2DMatrix(kernal33Float)imgErode = cv2.erode(littleMatrix, kernal33,  borderType=cv2.BORDER_CONSTANT, borderValue=0)imgDilate = cv2.dilate(littleMatrix, kernal33,  borderType=cv2.BORDER_CONSTANT, borderValue=0)imgErodeFloat = cv2.erode(littleMatrix, kernal33Float, borderType=cv2.BORDER_CONSTANT, borderValue=0)imgDilateFloat = cv2.dilate(littleMatrix, kernal33Float, borderType=cv2.BORDER_CONSTANT, borderValue=0)print("littleMatrix小矩阵数据如下:")print2DMatrix(littleMatrix)print(f"littleMatrix小矩阵采用普通0、1核矩阵腐蚀后矩阵元素类型为:{kernal33Float.dtype},结果数据如下:")print2DMatrix(imgErode)print(f"littleMatrix小矩阵采用采用普通0、1核矩阵膨胀后矩阵元素类型为:{kernal33Float.dtype},结果数据如下:")print2DMatrix(imgDilate)print(f"littleMatrix小矩阵采用浮点核矩阵腐蚀后矩阵元素类型为:{kernal33Float.dtype},结果数据如下:")print2DMatrix(imgErodeFloat)print(f"littleMatrix小矩阵采用浮点核矩阵膨胀后矩阵元素类型为:{kernal33Float.dtype},结果数据如下:")print2DMatrix(imgDilateFloat)if cmpMatrix(imgErode,imgErodeFloat):print("使用普通0、1核矩阵腐蚀和采用浮点核矩阵腐蚀得到的结果矩阵相同")else:print("使用普通0、1核矩阵腐蚀和采用浮点核矩阵腐蚀得到的结果矩阵不相同")if cmpMatrix(imgDilate, imgDilateFloat):print("使用普通0、1核矩阵膨胀和采用浮点核矩阵膨胀得到的结果矩阵相同")else:print("使用普通0、1核矩阵膨胀和采用浮点核矩阵膨胀得到的结果矩阵不相同")kernalTest()

程序执行打印输出内容如下:

kernal33矩阵元素类型为:uint8,数据内容如下:1	   1	   1	 1	   1	   1	 1	   1	   1	kernal33Float矩阵元素类型为:float32,数据内容如下:0.100000	0.100000	0.100000	 
0.100000	0.100000	0.100000	 
0.100000	0.100000	0.100000	littleMatrix小矩阵数据如下:0	   0	   0	   0	   0	   0	   0	   0	   0	   0	 0	   1	   2	   3	   4	   5	   6	   7	   8	   9	 0	   2	   4	   6	   8	  10	  12	  14	  16	  18	 0	   3	   6	   9	  12	  15	  18	  21	  24	  27	 0	   4	   8	  12	  16	  20	  24	  28	  32	  36	 0	   5	  10	  15	  20	  25	  30	  35	  40	  45	 0	   6	  12	  18	  24	  30	  36	  42	  48	  54	 0	   7	  14	  21	  28	  35	  42	  49	  56	  63	 0	   8	  16	  24	  32	  40	  48	  56	  64	  72	 0	   9	  18	  27	  36	  45	  54	  63	  72	  81	littleMatrix小矩阵采用普通01核矩阵腐蚀后矩阵元素类型为:uint8,结果数据如下:0	   0	   0	   0	   0	   0	   0	   0	   0	   0	 0	   0	   0	   0	   0	   0	   0	   0	   0	   0	 0	   0	   1	   2	   3	   4	   5	   6	   7	   0	 0	   0	   2	   4	   6	   8	  10	  12	  14	   0	 0	   0	   3	   6	   9	  12	  15	  18	  21	   0	 0	   0	   4	   8	  12	  16	  20	  24	  28	   0	 0	   0	   5	  10	  15	  20	  25	  30	  35	   0	 0	   0	   6	  12	  18	  24	  30	  36	  42	   0	 0	   0	   7	  14	  21	  28	  35	  42	  49	   0	 0	   0	   0	   0	   0	   0	   0	   0	   0	   0	littleMatrix小矩阵采用采用普通01核矩阵膨胀后矩阵元素类型为:uint8,结果数据如下:1	   2	   3	   4	   5	   6	   7	   8	   9	   9	 2	   4	   6	   8	  10	  12	  14	  16	  18	  18	 3	   6	   9	  12	  15	  18	  21	  24	  27	  27	 4	   8	  12	  16	  20	  24	  28	  32	  36	  36	 5	  10	  15	  20	  25	  30	  35	  40	  45	  45	 6	  12	  18	  24	  30	  36	  42	  48	  54	  54	 7	  14	  21	  28	  35	  42	  49	  56	  63	  63	 8	  16	  24	  32	  40	  48	  56	  64	  72	  72	 9	  18	  27	  36	  45	  54	  63	  72	  81	  81	 9	  18	  27	  36	  45	  54	  63	  72	  81	  81	littleMatrix小矩阵采用浮点核矩阵腐蚀后矩阵元素类型为:uint8,结果数据如下:0	   0	   0	   0	   0	   0	   0	   0	   0	   0	 0	   0	   0	   0	   0	   0	   0	   0	   0	   0	 0	   0	   1	   2	   3	   4	   5	   6	   7	   0	 0	   0	   2	   4	   6	   8	  10	  12	  14	   0	 0	   0	   3	   6	   9	  12	  15	  18	  21	   0	 0	   0	   4	   8	  12	  16	  20	  24	  28	   0	 0	   0	   5	  10	  15	  20	  25	  30	  35	   0	 0	   0	   6	  12	  18	  24	  30	  36	  42	   0	 0	   0	   7	  14	  21	  28	  35	  42	  49	   0	 0	   0	   0	   0	   0	   0	   0	   0	   0	   0	littleMatrix小矩阵采用浮点核矩阵膨胀后矩阵元素类型为:uint8,结果数据如下:1	   2	   3	   4	   5	   6	   7	   8	   9	   9	 2	   4	   6	   8	  10	  12	  14	  16	  18	  18	 3	   6	   9	  12	  15	  18	  21	  24	  27	  27	 4	   8	  12	  16	  20	  24	  28	  32	  36	  36	 5	  10	  15	  20	  25	  30	  35	  40	  45	  45	 6	  12	  18	  24	  30	  36	  42	  48	  54	  54	 7	  14	  21	  28	  35	  42	  49	  56	  63	  63	 8	  16	  24	  32	  40	  48	  56	  64	  72	  72	 9	  18	  27	  36	  45	  54	  63	  72	  81	  81	 9	  18	  27	  36	  45	  54	  63	  72	  81	  81	使用普通01核矩阵腐蚀和采用浮点核矩阵腐蚀得到的结果矩阵相同
使用普通01核矩阵膨胀和采用浮点核矩阵膨胀得到的结果矩阵相同Process finished with exit code 0

将核矩阵的元素换成其他数字,如直接在kernal33的元素值上乘以2作为核的元素值,结论相同。

3.2.3、结论

经测试验证核矩阵元素:

  1. 类型可以是各种矩阵元素允许的类型;
  2. 允许非0或1的数据甚至浮点数作为元素,非0的核矩阵元素与为1的核矩阵元素效果相同,腐蚀和膨胀时核元素只决定了源矩阵中的哪些元素参与运算,但核矩阵所有非0元素对腐蚀和膨胀的处理效果相同,即核矩阵中元素非0值本身无论取值多少都不会影响腐蚀和膨胀的效果。

但测试时发现有个问题,就是当核矩阵元素为浮点数时,核矩阵的元素不能出现0、0.0等零值,否则会出现如下异常:

cv2.error: OpenCV(4.3.0) C:/projects/opencv-python/opencv/modules/imgproc/src/morph.simd.hpp:649: error: (-215:Assertion failed) _kernel.type() == CV_8U in function 'cv::opt_AVX2::`anonymous-namespace'::MorphFilter<struct cv::opt_AVX2::`anonymous namespace'::MinOp<unsigned char>,struct cv::opt_AVX2::A0x30080e86::MorphVec<struct cv::opt_AVX2::`anonymous namespace'::VMin<struct cv::hal_AVX2::v_uint8x32> > >::MorphFilter'

该问题具体原因老猿暂时没有去研究。

总体来说,除了浮点类型的核矩阵不能出现零值外,核矩阵(必须小于源矩阵)可以自定义(就如同上面代码定义littleMatrix矩阵一样),其各元素的值可以随意赋值,不一定非要通过getStructuringElement构建核矩阵,大家可以自己尝试一下。

四、腐蚀和膨胀处理的图像矩阵问题

在老猿所查阅的所有介绍腐蚀和膨胀的资料中,腐蚀和膨胀处理的图像都是灰度图,没有看到处理彩色图像的,查阅官网资料,明确告知源图像矩阵可以是任意通道数的。

为此老猿做了验证,直接使用彩色图像进行腐蚀和膨胀,我们来看效果。

源代码:
def srcImgTest(imgfile):#测试腐蚀和膨胀的图像源类型函数img = cv2.imread(imgfile) kernal = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))imgErode = cv2.erode(img, kernal, borderType=cv2.BORDER_CONSTANT, borderValue=0)imgDilate = cv2.dilate(img, kernal, borderType=cv2.BORDER_CONSTANT, borderValue=0)print("kernal:")print2DMatrix(kernal)cv2.imshow('imgErode', imgErode)cv2.imshow('imgDilate', imgDilate)cv2.waitKey(0)cv2.destroyAllWindows()srcImgTest(r'F:\pic\pictures.png')#处理彩色图像文件

腐蚀结果图像截图:
在这里插入图片描述
可以看到原图腐蚀后,总体图像变暗,除了常规的亮度区域变小浅色区域变大外,3号图片彩色噪点变大,7号、9号、13号图片噪点消失,11号图片黑色噪点扩大。

膨胀结果图像截图:
在这里插入图片描述
可以看到原图膨胀后,总体变亮,除了常规的亮度区域变大暗色区域变小外,3号图片彩色噪点与腐蚀一样变大,7号、9号、13号图片噪点变大,8号、11号图片黑色噪点消失。

因此可以得出结论,腐蚀和膨胀可以直接对彩色图像进行处理,可以用于消除部分噪点,并且这种处理方式无法通过灰度图进行腐蚀和膨胀再进行其他图像操作来达到相同效果,但总体来说灰度图的腐蚀和膨胀对图像轮廓的处理应用更广,同样有彩色图像腐蚀和膨胀无法替代的能力。

五、边界类型问题

5.1、问题

在《OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍:https://blog.csdn.net/LaoYuanPython/article/details/109441709》中介绍了腐蚀和膨胀函数的参数borderType的值的含义,但该值缺省值为None,具体对应的边界类型官网没有介绍。只是从边界类型取值说明中感觉BORDER_ISOLATED 这个值比较象。

5.2、验证

构建一个矩阵,用所有可能的边界类型进行腐蚀和膨胀处理,与采用borderType为None的腐蚀和膨胀结果进行对比。

验证代码:
def bordtypeTest():bordetype={cv2.BORDER_CONSTANT:"BORDER_CONSTANT",cv2.BORDER_REPLICATE:"BORDER_REPLICATE ",cv2.BORDER_REFLECT:"BORDER_REFLECT",cv2.BORDER_REFLECT_101:'BORDER_REFLECT_101', cv2.BORDER_ISOLATED:'BORDER_ISOLATED'}img = np.zeros((100,100),np.uint8)for row in range(100):for col in range(100):img[row, col] = row*2+ colkernal = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))#kernal = np.zeros((3,3),dtype=np.uint8)kernal[0,0]  = 1imgDefaultErode = cv2.erode(img, kernal)imgDefaultDilate = cv2.dilate(img, kernal)for k in bordetype:v = bordetype[k]if k==0:imgErode = cv2.erode(img, kernal, borderType=k, borderValue=0)imgDilate = cv2.dilate(img, kernal, borderType=k, borderValue=0)else:imgErode = cv2.erode(img, kernal, borderType=k)imgDilate = cv2.dilate(img, kernal, borderType=k)cmpErode = cmpMatrix(imgErode,imgDefaultErode)cmpDilate = cmpMatrix(imgDilate,imgDefaultDilate)if cmpErode:print(f"bordtype={v}的腐蚀结果与缺省bordtype腐蚀图像相同")else:print(f"bordtype={v}的腐蚀结果与缺省bordtype腐蚀图像不同")if cmpDilate:print(f"bordtype={v}的膨胀结果与缺省bordtype膨胀图像相同")else:print(f"bordtype={v}的膨胀结果与缺省bordtype膨胀图像不同")bordtypeTest()
输出:
bordtype=BORDER_CONSTANT的腐蚀结果与缺省bordtype腐蚀图像不同
bordtype=BORDER_CONSTANT的膨胀结果与缺省bordtype膨胀图像相同
bordtype=BORDER_REPLICATE 的腐蚀结果与缺省bordtype腐蚀图像不同
bordtype=BORDER_REPLICATE 的膨胀结果与缺省bordtype膨胀图像相同
bordtype=BORDER_REFLECT的腐蚀结果与缺省bordtype腐蚀图像不同
bordtype=BORDER_REFLECT的膨胀结果与缺省bordtype膨胀图像相同
bordtype=BORDER_REFLECT_101的腐蚀结果与缺省bordtype腐蚀图像相同
bordtype=BORDER_REFLECT_101的膨胀结果与缺省bordtype膨胀图像不同
bordtype=BORDER_ISOLATED的腐蚀结果与缺省bordtype腐蚀图像相同
bordtype=BORDER_ISOLATED的膨胀结果与缺省bordtype膨胀图像相同

5.3、结论

从上述输出可以看出,除了bordtype=BORDER_ISOLATED与等于None效果完全相同,其他值不能完全相同,并且在多种不同图像下上述输出的比较情况还会发生变化,但BORDER_ISOLATED的比较情况固定不变。

六、迭代次数的影响

在腐蚀和膨胀处理的参数中,iterations形参对应实参n(n大于1)的作用我们认为是针对每次腐蚀的结果再次进行腐蚀,直到执行腐蚀n次。

验证代码:
def iterationsImgTest(imgfile):#测试腐蚀和膨胀的图像源类型函数img = cv2.imread(imgfile)kernal = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))imgErode1 = cv2.erode(img, kernal, borderType=cv2.BORDER_CONSTANT, borderValue=0)imgErode2 = cv2.erode(imgErode1, kernal, borderType=cv2.BORDER_CONSTANT, borderValue=0)imgErodeIterations = cv2.erode(img, kernal, iterations=2,borderType=cv2.BORDER_CONSTANT, borderValue=0)if cmpMatrix(imgErode1,imgErodeIterations):print("腐蚀1次结果图像和迭代腐蚀2次结果图像相同")else:print("腐蚀1次结果图像和迭代腐蚀2次结果图像不相同")if cmpMatrix(imgErode2,imgErodeIterations):print("腐蚀2次结果图像和迭代腐蚀2次结果图像相同")else:print("腐蚀2次结果图像和迭代腐蚀2次结果图像不相同")iterationsImgTest(r'F:\pic\pictures.png')
输出结果:
腐蚀1次结果图像和迭代腐蚀2次结果图像不相同
腐蚀2次结果图像和迭代腐蚀2次结果图像相同
结论:

iterations确实是针对每次腐蚀的结果再次进行腐蚀,直到执行腐蚀次数与iterations的实参相等。

七、小结

本文详细测试验证了OpenCV的腐蚀和膨胀erode、dilate函数在进行图像腐蚀和膨胀处理的一些细节,包括核矩阵的形状、核元素取值类型及值对腐蚀和膨胀的影响、图像矩阵是否支持彩色图片、bordType缺省值对应的边界类型分析以及迭代次数的作用,有助于大家深入理解OpenCV的腐蚀和膨胀erode、dilate函数的使用。

更多OpenCV-Python的介绍请参考专栏《OpenCV-Python图形图像处理 》
专栏网址:https://blog.csdn.net/laoyuanpython/category_9979286.html

写作不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

小技巧: 可以通过点击博文下面的一键三连按钮实现对相关文章的点赞、收藏和对博客的关注,谢谢!

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用 》(https://blog.csdn.net/laoyuanpython/category_9607725.html)专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》 (https://blog.csdn.net/laoyuanpython/category_10232926.html)详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。

付费专栏文章目录:《moviepy音视频开发专栏文章目录》(https://blog.csdn.net/LaoYuanPython/article/details/107574583)、《使用PyQt开发图形界面Python应用专栏目录 》(https://blog.csdn.net/LaoYuanPython/article/details/107580932)。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》(https://blog.csdn.net/laoyuanpython/category_9831699.html)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学OpenCV!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░


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

相关文章

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

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

opencv之dilate()函数

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

OpenCV-膨胀cv::dilate

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

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

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

chatgpt赋能Python-python_dilate

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

OPenCV膨胀函数dilate()的使用

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

OpenCV每日函数 图像过滤模块 (5) dilate膨胀函数

一、概述 通过使用特定的结构元素来扩大图像。该函数使用指定的结构元素扩展源图像,该结构元素确定取最大值的像素邻域的形状: 膨胀可以应用数次(迭代)。 在多通道图像的情况下,每个通道都是独立处理的。 膨胀: 腐蚀: 二、dilate函数 1、函数原型 cv::dilate…

生产环境屏蔽swagger

只需要在swagger的配置类上增加Profile( )注解&#xff0c;指定环境变量&#xff0c;即可屏蔽生产环境上的swagger&#xff0c;如下&#xff1a; 先使用dev环境&#xff0c;访问swagger&#xff0c;结果如下&#xff1a; 再使用test环境&#xff0c;访问swagger&#xff0c;结果…

生产环境解决跨域

1.先决条件是在开发环境中使用的是代理。 2然后在生产环境当中&#xff0c;增加一个proxy代理&#xff1b; &#xff08;1&#xff09;先下载&#xff1a;cnpm install http-proxy-middleware -D &#xff08;2&#xff09;引入&#xff1a; &#xff08;3&#xff09;使用&am…

linux环境下编译部署php生产环境

linux环境下编译部署php生产环境 版本控制 php&#xff1a;7.2.4 nginx&#xff1a;1.9.9 部分插件版本 xlswriter&#xff1a;1.3.3.2 redis:3.1.3 一、安装php 1.安装依赖(之后安装缺少的依赖都可以用yum安装) yum install -y gcc gcc-c make zlib zlib-devel pcre pcre…

用 source map 调试生产环境

当我们的应用程序部署到生产环境时&#xff0c;我们发现它与我们在开发环境时的代码不同。我们的代码在构建过程中会以各种方式进行修改和优化。 TypeScript 被转译、压缩。生成的 JavaScript 包尽可能小并且能够在浏览器中正常运行。 所有这些步骤都很有效率&#xff0c;它们…

uniapp 小程序 开发环境和生产环境

uni开发小程序 运行到开发工具 再上传 process.env.NODE_ENV 获取的值是development 一直是开发环境 用uni发行 上传到微信公众平台是生成环境 在 HBuilderX 中&#xff0c;点击“运行”编译出来的代码是开发环境&#xff0c;点击“发行”编译出来的代码是生产环境 let url;if …

Vue cli3配置生产环境,开发环境,和测试环境

目录1、先在package.json文件中添加&#xff1a; 2、在项目目录下建立 .env文件和.env.test文件 3、配置api变量 3.1、配置axios的baseURL路径 3.2、自己拼接的路径 4、.env知识点补充 4.1&#xff0c;关于文件名&#xff1a;必须以如下方式命名&#xff0c;不要…

31 SpringBoot多环境的切换(生产环境、开发环境、测试环境)

参考链接&#xff1a; Spring官网 Spring官网 外部配置加载顺序的说明 SpringBoot多环境的切换(生产环境、开发环境、测试环境)_周太阳的博客-CSDN博客_springboot测试生产环境切换 java maven 测试生产环境配置_SpringBoot生产环境和测试环境配置分离的教程详解_落云歌语文…

生产环境关闭 swagger

#生产环境需要关闭 swagger 防止接口暴露 1&#xff0c;启动判断写在相应的环境配置文件中&#xff0c;根据条件判断是否启动 swagger &#xff1a; 添加配置项&#xff1a;swagger.is.enable #是否激活 swagger true or false swagger.is.enabletrue2&#xff0c;代码取值&a…

前端工程师生产环境 debugger 技巧

关注公众号 前端开发博客&#xff0c;领27本电子书 回复加群&#xff0c;自助秒进前端群 导言 开发环境 debug 是每个程序员上岗的必备技能。生产环境呢&#xff1f;虽然生产环境 debug 是一件非常不优雅的行为&#xff0c;但是由于种种原因&#xff0c;我们又不得不这么干。 那…

【微信小程序 | 实战开发】开发环境、测试环境和生产环境

写在前面&#xff1a; 你是否想要掌握人工智能的最新技术和应用&#xff1f;你是否想要成为未来社会的创新者和领导者&#xff1f;你是否想要和全球的优秀导师和同学一起学习和交流&#xff1f;如果你的答案是肯定的&#xff0c;那么欢迎来到床长人工智能教程网站&#xff0c;这…

Nginx生产环境平滑升级

一.背景 最近遇到一个比较尴尬而又实际的问题&#xff0c;那就是我们生产环境使用的Nginx是Centos6的老古董。业务需求需要加载Nginx的一个模块来实现&#xff0c;但是版本太老了&#xff0c;需要Nginx1.18之后才能支持&#xff0c;而我们的是Nginx1.12。 那升级Nginx是我们要做…

生产环境和开发环境_环境部署:开发、测试和线上环境的区别

点击蓝字 关注我们 软件开发环境(Software Development Environment,SDE)是指在基本硬件和宿主软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件,简称SDE。它由软件工具和环境集成机制构成,前者用以支持软件开发的相关过程、活动和任务,后者…

python生产环境部署

文章目录 一、前言二、准备工作三、安装python四、安装虚拟环境 一、前言 在实际工作中&#xff0c;很多公司的生产环境都是隔离外网的&#xff0c;而且往往多个项目组共用相同的服务器&#xff0c;因此经常会遇到两个问题&#xff1a; python以及第三方模块的版本难以统一&a…