opencv-图像处理-2-形态学操作

一、基础概念:连通性与邻域关系

在学习形态学操作之前,需要先理解图像中像素的连通性。这是形态学操作的理论基础:

  1. 4 邻接:像素 p (x,y) 的上下左右四个相邻像素
  2. D 邻接:像素 p 的对角相邻像素
  3. 8 邻接:4 邻接 + D 邻接的所有像素

基于邻接关系,有三种连通性:

  • 4 连通:通过 4 邻域可达
  • 8 连通:通过 8 邻域可达

二、腐蚀与膨胀:最基本的形态学操作

腐蚀和膨胀是形态学操作的基础,它们的作用是改变图像中前景物体的大小:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
img = cv.imread("letter.png")

# 创建5x5的结构元素
kernel = np.ones((5, 5), np.uint8)

# 图像腐蚀和膨胀
erosion = cv.erode(img, kernel)  # 腐蚀
dilate = cv.dilate(img, kernel)  # 膨胀

# 图像展示
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(8, 5), dpi=100)
axes[0].imshow(img)
axes[0].set_title("原图")
axes[1].imshow(erosion)
axes[1].set_title("腐蚀后结果")
axes[2].imshow(dilate)
axes[2].set_title("膨胀后结果")
plt.show()

操作原理

腐蚀:用结构元素扫描图像,只有当结构元素覆盖的所有像素值都为 1 时,中心像素才保持为 1

膨胀:只要结构元素覆盖的像素中有一个为 1,中心像素就被置为 1

实际效果

  • 腐蚀:消除小物体、分离相连物体
  • 膨胀:连接断裂的物体、填充前景中的小洞

三、开运算与闭运算:基于基础操作的高级变换

开运算和闭运算是腐蚀和膨胀的组合操作,它们能实现更复杂的图像预处理:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
img_open = cv.imread("letteropen.png")
img_close = cv.imread("letterclose.png")

# 创建10x10的结构元素
kernel = np.ones((10, 10), np.uint8)

# 图像的开闭运算
cvOpen = cv.morphologyEx(img_open, cv.MORPH_OPEN, kernel)  # 开运算
cvClose = cv.morphologyEx(img_close, cv.MORPH_CLOSE, kernel)  # 闭运算

# 图像展示
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
axes[0, 0].imshow(img_open)
axes[0, 0].set_title("原图")
axes[0, 1].imshow(cvOpen)
axes[0, 1].set_title("开运算结果")
axes[1, 0].imshow(img_close)
axes[1, 0].set_title("原图")
axes[1, 1].imshow(cvClose)
axes[1, 1].set_title("闭运算结果")
plt.show()

操作原理

  • 开运算:先腐蚀后膨胀,用于消除小物体、平滑边界
  • 闭运算:先膨胀后腐蚀,用于填充小孔、连接邻近物体

典型应用

  • 开运算:去除图像中的盐噪声、分离粘连物体
  • 闭运算:填充物体内部的空洞、去除胡椒噪声

 

四、礼帽与黑帽:提取图像细节特征

礼帽和黑帽运算是更高级的形态学变换,用于提取图像中的特定细节:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
img1 = cv.imread("letteropen.png")
img2 = cv.imread("letterclose.png")

# 创建10x10的结构元素
kernel = np.ones((10, 10), np.uint8)

# 图像的礼帽和黑帽运算
cvOpen = cv.morphologyEx(img1, cv.MORPH_TOPHAT, kernel)  # 礼帽运算
cvClose = cv.morphologyEx(img2, cv.MORPH_BLACKHAT, kernel)  # 黑帽运算

# 图像显示
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 5))
axes[0, 0].imshow(img1)
axes[0, 0].set_title("原图")
axes[0, 1].imshow(cvOpen)
axes[0, 1].set_title("礼帽运算结果")
axes[1, 0].imshow(img2)
axes[1, 0].set_title("原图")
axes[1, 1].imshow(cvClose)
axes[1, 1].set_title("黑帽运算结果")
plt.show()

操作原理

  • 礼帽运算:原始图像减去开运算结果,突出比结构元素小的前景细节
  • 黑帽运算:闭运算结果减去原始图像,突出比结构元素小的背景细节

实际应用

  • 礼帽运算:从 X 光图像中提取微小钙化点、识别小型建筑物
  • 黑帽运算:检测印刷电路板划痕、分析文本图像中的阴影区域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值