图像处理--形态学处理

形态学概述

形态学是图像处理中应用最为广泛的技术之一,主要用于提取图像中对表和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。此外,细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。
形态学的基本思想是利用一种特殊的结构元来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。

形态学转换

腐蚀和膨胀

腐蚀和膨胀是两种最基本、最重要的形态学运算,它们是很多高级形态学处理的基础,有许多形态学算法是由这两种基本运算复合而成的。
结构元素
腐蚀与膨胀操作中都需要用到结构元素,可以将二维结构元素理解为一个二维矩阵,矩阵元素是值为“0”或“1”。一般情况下,结构元素的尺寸小于待处理图像的尺寸。
腐蚀(Erosion)
腐蚀的作用是消除小且无意义的目标物,其具体实现步骤如下:
1)基于结构元素建立一个图像矩阵,并确定其原点。此处以结构元素中左上角的元素为原点,并用较深的底色进行标记。
在这里插入图片描述
2)将结构元素覆盖至待处理图像上。如果在待处理图像中,结构元素内所有值为“1”的元素对应的图像像素点的值也都为“1”,则在输出图像中将原点对应位置的像素点赋值为“1”,否则为“0”。
在这里插入图片描述
3)令结构元素按顺序在待处理图像上进行移动,直至图像全部处理完成,得到的结果图像如下图所示:
在这里插入图片描述
膨胀(Dilation)
膨胀的作用是扩大图像边缘,填充目标物体边缘或内部的非目标像素点,其具体实现步骤如下:
1)基于结构元素建立一个图像矩阵,并确定其原点。此处以结构元素中左上角的元素为原点,并用较深的底色进行标记。
在这里插入图片描述
2)将结构元素覆盖至待处理图像上。如果在待处理图像中,结构元素内所有值为“1”的元素对应的图像像素点的值至少有一个为“1”,则在输出图像中将原点对应位置的像素点赋值为“1”,否则为“0”。
在这里插入图片描述
3)令结构元素按顺序在待处理图像上进行移动,直至图像全部处理完成,得到的结果图像如下图所示:
在这里插入图片描述

开运算和闭运算

开运算和闭运算就是按照一定顺序进行腐蚀和膨胀操作。
开运算
开运算是先腐蚀后膨胀,其作用是分离物体、消除小区域、消除暗背景下的高亮区域。
闭运算
闭运算是先膨胀后腐蚀,其作用是消除孔洞,即填充闭合区域、删除亮背景下的暗区域。

顶帽和底帽

顶帽运算(礼帽)
顶帽运算也称作礼帽,是原始图像与开运算结果图之差(顶帽运算=原始图像-开运算结果图),可以获取原始图像中灰度较亮的区域。
底帽运算(黑帽)
底帽运算也称作黑帽,是原始图像与闭运算结果图之差(底帽运算=原始图像-闭运算结果图),可以获取原始图像中灰度较暗的区域。

代码

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# 图像读取
img_org = cv2.imread('example_org.jpg')
img_noise = cv2.imread('example_noise.jpg')
img_cave = cv2.imread('example_cave.jpg')
 
# 创建核结构
kernel = np.ones((10, 10), np.uint8)  # 10*10的全1矩阵
 
# 形态学处理
erosion_img = cv2.erode(img_org, kernel)  # 腐蚀
dilate_img = cv2.dilate(img_org, kernel)  # 膨胀
open_img = cv2.morphologyEx(img_noise, cv2.MORPH_OPEN, kernel)  # 开运算
close_img = cv2.morphologyEx(img_cave, cv2.MORPH_CLOSE, kernel)  # 闭运算
top_hat_img = cv2.morphologyEx(img_noise, cv2.MORPH_TOPHAT, kernel)  # 礼帽运算
black_hat_img = cv2.morphologyEx(img_cave, cv2.MORPH_BLACKHAT, kernel)  # 黑帽运算
 
# 图像显示
plt.figure(figsize=(10, 6), dpi=100)
plt.rcParams['axes.unicode_minus'] = False
 
plt.subplot(331), plt.imshow(img_org), plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(332), plt.imshow(erosion_img), plt.title("Erosion")
plt.xticks([]), plt.yticks([])
plt.subplot(333), plt.imshow(dilate_img), plt.title("Dilation")
plt.xticks([]), plt.yticks([])
 
plt.subplot(334), plt.imshow(img_noise), plt.title("Original2")
plt.xticks([]), plt.yticks([])
plt.subplot(335), plt.imshow(open_img), plt.title("Open Operation")
plt.xticks([]), plt.yticks([])
plt.subplot(336), plt.imshow(top_hat_img), plt.title("TopHat")
plt.xticks([]), plt.yticks([])
 
plt.subplot(337), plt.imshow(img_cave), plt.title("Original3")
plt.xticks([]), plt.yticks([])
plt.subplot(338), plt.imshow(close_img), plt.title("Close Operation")
plt.xticks([]), plt.yticks([])
plt.subplot(339), plt.imshow(black_hat_img), plt.title("BlackHat")
plt.xticks([]), plt.yticks([])
 
plt.show()

部分函数注解

在这里插入图片描述
dilate()函数的参数含义与erode()函数的相同。
在这里插入图片描述

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天一道题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值