图像处理--形态学处理

时间:2022-10-17 07:51:37

形态学概述

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

形态学转换

腐蚀和膨胀

腐蚀和膨胀是两种最基本、最重要的形态学运算,它们是很多高级形态学处理的基础,有许多形态学算法是由这两种基本运算复合而成的。
结构元素
腐蚀与膨胀操作中都需要用到结构元素,可以将二维结构元素理解为一个二维矩阵,矩阵元素是值为“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()函数的相同。
图像处理--形态学处理