opencv 膨胀和腐蚀

图像处理之形态学操作
本文介绍了图像处理中常用的形态学操作,包括膨胀、腐蚀、开运算、闭运算等,并详细解析了各自的实现原理和应用场景。

膨胀腐蚀是对高亮部分的操作(及大像素值)膨胀腐蚀可以消除噪声,连接相邻区域,分割独立区域,寻求区域最大最小值


膨胀的原理是通过一个核去边缘覆盖,然后取这个核的最大值,把核的其他区域用最大值替换,结果就是白色区域扩张了,对于彩色或灰度图就是图片像素变大,变得更亮

腐蚀的原理刚好与膨胀相反,腐蚀是把区域内的值用区域内的最小值代替,对于二值化图就是用0(黑)代替。



一:膨胀函数 dilate

dilate( InputArray src, OutputArray dst, InputArray kernel,   Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,  constScalar&borderValue=morphologyDefaultBorderValue() );

第三个参数是Mat类的核可以用Mat elemt=getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1));函数得到

getStructuringElement中的第一个参数是核的形状MORPH_RECT=0--矩形, MORPH_CROSS=1--十字形, MORPH_ELLIPSE=2--椭圆

第二个参数是内核大小

第三个是锚点位置(-1,-1)表示锚点在中心

dilate函数的第四个参数是内核位置(-1,-1)表示锚点在中心,

第五个参数是腐蚀次数

其函数最后最后几个参数一般默认




二:腐蚀函数erode

其参数类型和膨胀函数的参数类型一致

erode(srcImage,dstImage,elemt);



效果图



腐蚀的有点严重线条全部不见了



三:开运算(morph_open)

开运算实质就是对图像先腐蚀再膨胀,开运算可以消除小物体,在纤细点处分离物体,并在平滑较大物体时不明显的改变面积


四:闭运算(morph_close)

闭运算时候先膨胀再腐蚀,闭运算可以消除小黑点


五:形态学梯度(gradient)

形态学梯度是膨胀图与腐蚀图只差,可以保留和突出边缘


六:顶帽(morph_tophat)

顶帽是闭运算结果与原图做差的结果,可以分离比临近点亮一些的斑块(一些大的亮斑)


七:黑帽(morph_blacktop)

黑帽是原图与开运算结果 相减的结果,可以分离比临近点暗的斑块

膨胀腐蚀是形态学图像处理中的两种基本操作,在 OpenCV 中有广泛应用。 ### 原理 - **膨胀操作**:用于扩展图像中的前景区域(通常是白色区域),其基本思想是通过结构元素“扩张”图像中的前景对象,使得前景区域变大,从而填补小的空隙或连接断裂的部分。它通过结构元素滑动来增强图像边缘连接断裂线条 [^2][^3]。 - **腐蚀操作**:与膨胀相反,腐蚀操作将图像中的物体收缩 [^1]。 ### 用法 OpenCV 提供了简便的函数来实现这些操作: - **膨胀**:使用 `cv2.dilate()` 函数实现。其原型为: ```python cv2.dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None) ``` 参数解释如下: - `src`:输入图像,通道的数量可以是任意的,但是深度应该是 `CV_8U`、`CV_16U`、`CV_16S`、`CV_32F` 或 `CV_64F` 之一。 - `dst`:与 `src` 相同大小类型的输出图像。 - `kernel`:用于膨胀的结构单元,如果 `kernel=Mat()`,则使用一个 3×3 的矩形结构元素,也可以使用 `getStructuringElement` 创建结构元素。 - `anchor`:锚点在结构元素中的位置,默认值 `(-1, -1)` 表示锚位于结构元素的中心。 - `iterations`:施加膨胀的次数,默认施加一次。 - `borderType`:图像边界像素向外扩展的方法,不支持 `BORDER_WRAP`,默认为 `BORDER_CONSTANT`,表示使用边界像素进行扩展。 - `borderValue`:边界为常量时的边界值,使用函数 `morphologyDefaultBorderValue` 返回膨胀腐蚀的“Magic”边界值,它会自动转换为标量 `::all(-DBL_MAX)` 进行膨胀 [^4]。 - **腐蚀**:使用 `cv2.erode()` 函数实现,其参数与 `cv2.dilate()` 类似。 ### 示例 ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('example.jpg', 0) # 创建结构元素 kernel = np.ones((5, 5), np.uint8) # 膨胀操作 dilated_image = cv2.dilate(image, kernel, iterations=1) # 腐蚀操作 eroded_image = cv2.erode(image, kernel, iterations=1) # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Dilated Image', dilated_image) cv2.imshow('Eroded Image', eroded_image) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值