【OpenCV】(八)—— 腐蚀和膨胀

【OpenCV】(八)—— 腐蚀和膨胀

腐蚀(Erosion)和膨胀(Dilation)是形态学图像处理中的两种基本操作,常用于二值图像和灰度图像的处理。这两种操作可以改变图像中对象的形状和大小,通常用于去除噪声、填充空洞、分离或连接对象等。

腐蚀操作会减小图像中前景对象的大小。具体来说,腐蚀会将图像中的每个像素与其邻域内的所有像素进行比较,只有当邻域内的所有像素都属于前景对象时,该像素才保留为前景对象。否则,该像素会被设置为背景。腐蚀可以用于消除图像中的毛刺等细小噪声。

膨胀操作会增大图像中前景对象的大小。具体来说,膨胀会将图像中的每个像素与其邻域内的所有像素进行比较,只要邻域内有一个像素属于前景对象,该像素就会被设置为前景对象。膨胀操作相当于突出主体内容(加粗)

在 OpenCV 中,腐蚀和膨胀分别由 cv2.erodecv2.dilate 函数实现。

cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst

参数说明

  • src: 输入图像。
  • kernel: 结构元素(通常是矩形或椭圆形),用于定义邻域的形状和大小。
  • dst: 输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。
  • anchor: 结构元素的锚点位置,默认为 (-1, -1),表示锚点位于结构元素的中心。
  • iterations: 迭代次数,默认为 1。增加迭代次数会增强腐蚀或膨胀的效果。
  • borderType: 边界填充方式,默认为cv2.BORDER_CONSTANT。常见的边界填充方式有:
    • cv2.BORDER_CONSTANT: 用常数值填充边界。
    • cv2.BORDER_REFLECT: 用镜像反射的方式填充边界。
    • cv2.BORDER_REPLICATE: 用边界像素值重复填充边界。
    • cv2.BORDER_WRAP: 用环绕方式填充边界。
  • borderValue: 边界填充的值,默认为 0。

【示例】使用的示例图片如下:
在这里插入图片描述

# 可以选择不同的核大小核迭代次数来控制效果
kernel = np.ones((3,3))
erosion = cv2.erode(img,kernel,iterations= 2)

cv_show("erosion",erosion)

在这里插入图片描述

# 先进行腐蚀去除毛刺,再使用膨胀突出主体
kernel = np.ones((3,3))
dilate = cv2.dilate(erosion,kernel,iterations=1)
cv_show("dilate",dilate)

在这里插入图片描述

开运算与闭运算

开运算(Opening)和闭运算(Closing)分别基于腐蚀(Erosion)和膨胀(Dilation)操作组合而成。开运算和闭运算在处理二值图像和灰度图像时非常有用,可以用于去除噪声、填充空洞、平滑对象边界等。

开运算是先腐蚀后膨胀的操作。开运算的主要作用是:

  • 去除小的前景对象:可以去除图像中的小噪声点。
  • 平滑对象边界:使对象的边界更加平滑,去除细小的凸起。

闭运算是先膨胀后腐蚀的操作。闭运算的主要作用是:

  • 填充小的背景区域:可以填充图像中的小孔洞。
  • 平滑对象边界:使对象的边界更加平滑,去除细小的凹陷。

在 OpenCV 中,开运算和闭运算分别由 cv2.morphologyEx 函数实现,通过设置不同的参数来选择相应的操作。

# 开运算:先腐蚀,再膨胀
img = cv2.imread('dige.jpg')

kernel = np.ones((5,5))
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

cv_show("opening",opening)

在这里插入图片描述

# 闭运算:先膨胀,再腐蚀
img = cv2.imread('dige.jpg')

kernel = np.ones((5,5))
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

cv_show("closing",closing)

在这里插入图片描述

顶帽和黑帽

“黑帽”(Black Hat)和“顶帽”(Top Hat)是两种基于开运算和闭运算的高级操作。这些操作可以用于增强图像中的特定特征,如去除背景中的均匀区域或突出小的前景对象。

黑帽操作是先进行闭运算,然后从原图像中减去闭运算的结果。

顶帽操作是先进行开运算,然后从原图像中减去开运算的结果。

在 OpenCV 中,黑帽和顶帽操作分别由 cv2.morphologyEx 函数实现,通过设置不同的参数来选择相应的操作。

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
参数说明
  • src: 输入图像。
  • op: 操作类型,可以是 cv2.MORPH_BLACKHAT(黑帽)或 cv2.MORPH_TOPHAT(顶帽)。
  • kernel: 结构元素,用于定义邻域的形状和大小。
  • dst: 输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。
  • anchor: 结构元素的锚点位置,默认为 (-1, -1),表示锚点位于结构元素的中心。
  • iterations: 迭代次数,默认为 1。增加迭代次数会增强黑帽或顶帽的效果。
  • borderType: 边界填充方式,默认为cv2.BORDER_CONSTANT。常见的边界填充方式有:
    • cv2.BORDER_CONSTANT: 用常数值填充边界。
    • cv2.BORDER_REFLECT: 用镜像反射的方式填充边界。
    • cv2.BORDER_REPLICATE: 用边界像素值重复填充边界。
    • cv2.BORDER_WRAP: 用环绕方式填充边界。
  • borderValue: 边界填充的值,默认为 0。
# 礼帽:原始输入-开运算结果
img = cv2.imread('dige.jpg')
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv_show("tophat",tophat)

在这里插入图片描述

# 黑帽:闭运算结果-原始输入
img = cv2.imread('dige.jpg')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv_show("blackhat",blackhat)

在这里插入图片描述

### OpenCV 中的图像形态学操作 #### 图像读取与预处理 为了执行形态学操作,首先需要加载并准备目标图像。这一步骤涉及使用 `cv2.imread` 函数读取图像文件,并将其转换成灰度模式以便简化后续的操作[^1]。 ```python import cv2 as cv import numpy as np # 加载彩色图片并转为灰度图 image = cv.imread('example_image.jpg', 0) # 'example_image.jpg' 是要处理的图片路径 if image is None: raise ValueError("无法找到指定的图片") gray_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 显示原始图像 cv.imshow('Original Image', gray_image) cv.waitKey(0) ``` #### 创建结构元素 接着,构建一个5×5大小的一致性内核作为结构元素,该元素将在接下来的各种形态变换过程中起到关键的作用。这里采用的是全填充矩形形状的内核,也可以根据实际需求调整其尺寸或选择其他类型的结构元素[^4]。 ```python kernel = np.ones((5, 5), dtype=np.uint8) # 定义5x5的正方形结构元素 ``` #### 执行腐蚀膨胀操作 利用上述定义好的结构元素对输入图像实施基本的形态学变化——即腐蚀(`cv2.erode`) 和膨胀 (`cv2.dilate`) 。这两种基础操作能够改变二值化图像中前景对象(白色区域)与其他背景部分之间的边界关系: - **腐蚀**会使物体边缘向内部收缩; - **膨胀**则相反,会使得物体向外扩张。 ```python erosion_result = cv.erode(gray_image, kernel, iterations=1) # 进行一次腐蚀操作 dilation_result = cv.dilate(gray_image, kernel, iterations=1) # 进行一次膨胀操作 # 展示结果 cv.imshow('Erosion Result', erosion_result) cv.imshow('Dilation Result', dilation_result) cv.waitKey(0) ``` #### 实施开运算和闭运算 基于前面提到的基础形态学操作,进一步组合形成更复杂的变换方式—开运算(`cv2.morphologyEx` with `cv2.MORPH_OPEN`) 及闭运算 (with `cv2.MORPH_CLOSE`) : - **开运算**是指先做腐蚀再做膨胀的过程,有助于去除细小的对象或连接处较窄的部分。 - **闭运算**则是指先膨胀腐蚀的过程,主要用于填补小型孔洞和平滑轮廓线上的凹陷部位。 ```python opening_result = cv.morphologyEx(gray_image, cv.MORPH_OPEN, kernel) # 应用开运算 closing_result = cv.morphologyEx(gray_image, cv.MORPH_CLOSE, kernel) # 应用闭运算 # 将最终结果显示出来 cv.imshow('Opening Operation', opening_result) cv.imshow('Closing Operation', closing_result) cv.waitKey(0) cv.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值