文章目录
一、图像形态学
图像形态学是数学中研究形状、结构和变换的一个分支,在图像处理领域,它主要用于描述和分析图像中的形状和结构。图像形态学通过操作图像中的形状和结构元素(也称为内核或模板),来实现图像的分析、增强、去噪和特征提取等目的。这一领域为计算机视觉、图像识别和医学图像处理等领域提供了强大的工具和方法。
二、图像形态学的基本概念
- 结构元素(Structuring Element):结构元素是形态学操作的基本组成部分,它定义了形态学操作的形状和大小。通常是一个小的矩形、圆形或其他形状的核。在腐蚀和膨胀等操作中,结构元素在图像上滑动并与图像进行匹配,用来确定操作的范围。
- 腐蚀(Erosion):腐蚀是一种形态学操作,它通过结构元素对图像进行局部最小值滤波,使图像中边界部分逐渐缩小。腐蚀操作可以用于去除图像中的噪声、分割物体等。
- 膨胀(Dilation):膨胀是一种形态学操作,它通过结构元素对图像进行局部最大值滤波,使图像中的边界部分逐渐扩张。膨胀操作可以用于填充图像中的空洞、连接物体等。
三、形态学操作的主要类型
- 腐蚀(Erosion):
- 原理:使用结构元素在图像上滑动,只有当结构元素范围内的像素全部满足条件(如全为前景色)时,中心像素才保持不变,否则被置为背景色。
- 应用:消除小型噪声、分离接触对象、细化物体边缘等。
- 膨胀(Dilation):
- 原理:使用结构元素在图像上滑动,只要结构元素与图像中的任何一个像素相交,中心像素就被设置为前景色。
- 应用:填充图像中的空洞、连接相邻的对象、消除图像中的小黑点等。
- 开运算(Opening):
- 定义:先进行腐蚀操作,再进行膨胀操作的组合。
- 应用:消除小型噪声、平滑较大物体的边界而不明显改变其面积。
- 闭运算(Closing):
- 定义:先进行膨胀操作,再进行腐蚀操作的组合。
- 应用:填充物体间的小空洞、连接邻近的断裂物体等。
- 形态学梯度(Morphological Gradient):
- 定义:膨胀图像与腐蚀图像的差异,用于检测图像中的边缘和轮廓。
- 顶帽运算(Top Hat)与底黑帽运算(Black Hat):
- 顶帽运算是原始图像与开运算之间的差异,用于提取比原始图像更亮的区域。
- 黑帽运算是闭运算与原始图像之间的差异,用于提取比原始图像更暗的区域。
四、代码实现
1.图像腐蚀
python
import cv2
import numpy as np
sun = cv2.imread('sun.png')
cv2.imshow('a', sun)
cv2.waitKey(0)
kernel = np.ones((5, 5), np.uint8) #设置kenenel大小
erosion_1 = cv2.erode(sun, kernel, iterations=2) #kenenel大小默认为3*3 iterations默认为1
cv2.imshow('erosion_1', erosion_1)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 代码解释:设置了结构元素的大小为 5x5,并指定了腐蚀操作的迭代次数为 2。这意味着腐蚀操作将连续进行两次,每次都会使用5x5 的结构元素来减少图像中的亮区域。
- 显示结果:使用 cv2.imshow 来显示原始图像和腐蚀后的图像。
- 关闭窗口:在显示图像后,使用 cv2.waitKey(0)来等待用户按键。在 cv2.waitKey(0) 之后,调用cv2.destroyAllWindows() 来关闭所有 OpenCV 创建的窗口。
2.图像膨胀
python
import cv2
import numpy as np
wenzi = cv2.imread('word.png')
cv2.imshow('b', wenzi)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)
wenzi_new = cv2.dilate(wenzi, kernel, iterations=2)
cv2.imshow('wenzi-new', wenzi_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 读取并显示文件:使用cv2.imread函数读取名为'word.png'的图像文件,并将其存储在变量wenzi中,显示图像,窗口标题为'b',图像为wenzi 。
- 图像膨胀:创建一个2x2的结构元素,所有元素的值都设为1,这个结构元素将用于图像膨胀操作 ,使用cv2.dilate函数对wenzi图像进行两次膨胀操作。
- 显示图像:使用cv2.imshow函数显示膨胀后的图像,窗口标题为'wenzi-new' ,最后关闭窗口。
3.开运算-先腐蚀后膨胀
python
import cv2
import numpy as np
zhiwen = cv2.imread('zhiwen1.png')
cv2.imshow('a1',zhiwen)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('b1',zhiwen_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 读取并显示文件:读取名为'zhiwen1.png'的图像文件,并将其存储在变量zhiwen中,使用cv2.imshow函数显示原始图像,窗口标题为'a1' 。
- 开运算操作:创建一个2x2的结构元素,所有元素的值都设为1,使用cv2.morphologyEx函数对zhiwen图像进行形态学开运算。
- 显示图像:使用cv2.imshow函数显示形态学开运算后的图像,窗口标题为'b1',关闭所有OpenCV创建的窗口 。
4.闭运算-先膨胀后腐蚀
python
import cv2
import numpy as np
zhiwen = cv2.imread('zhiwen2.png')
cv2.imshow('a2',zhiwen)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('b2',zhiwen_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 读取图像:使用cv2.imread函数读取名为zhiwen2.png的图像文件,并将其存储在变量zhiwen中。使用cv2.imshow函数显示原始图像。第一个参数是窗口的标题,这里设置为'a2',第二个参数是要显示的图像,即zhiwen。
- 闭运算操作:创建一个2x2的结构元素(或称为核),所有元素的值都设为1。这个结构元素将用于形态学操作。使用函数对zhiwen图像进行形态学闭运算。
- 显示图像:使用cv2.imshow函数显示形态学开运算后的图像。窗口标题设置为'b2',关闭所有由OpenCV创建的窗口。
5.梯度运算
python
word = cv2.imread('word.png')
cv2.imshow('a',word)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
#膨胀
pz_word = cv2.dilate(word,kernel,iterations=2)
cv2.imshow('b',pz_word)
cv2.waitKey(0)
#腐蚀
fs_word = cv2.erode(word,kernel,iterations=1)
cv2.imshow('c',fs_word)
cv2.waitKey(0)
# 膨胀-腐蚀
word_new = cv2.morphologyEx(word,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('d',word_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 膨胀操作(cv2.dilate)会扩大图像中的亮区域(或白色区域),通常用于增强前景物体或连接相邻的亮区域。
- 腐蚀操作(cv2.erode)会缩小图像中的亮区域,通常用于去除小的白噪声或前景物体上的小黑点。
- 形态学梯度(cv2.MORPH_GRADIENT)是膨胀后的图像与腐蚀后的图像之间的差异。它通常用于突出显示图像中物体的边缘,因为边缘区域在膨胀和腐蚀操作中会经历最大的变化。
6.顶帽与黑帽
python
sun = cv2.imread('sun.png')
cv2.imshow('a', sun)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)
# 开运算
open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
cv2.imshow('b', open_sun)
cv2.waitKey(0)
# 顶帽
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('c', tophat)
cv2.waitKey(0)
# 闭运算
close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
cv2.imshow('d', close_sun)
cv2.waitKey(0)
# 黑帽
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('e', blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 读取并显示图像:使用cv2.imread函数读取名为sun.png的图像文件,并将其存储在变量sun中。使用cv2.imshow函数在窗口中显示原始图像,窗口标题为'a'。
- 定义结构元素:创建一个2x2的结构元素(或称为核),所有元素的值都设为1,数据类型为np.uint8。这个结构元素将用于后续的形态学变换。
- 开运算:使用cv2.morphologyEx函数对图像进行开运算。开运算是先腐蚀后膨胀的过程,用于去除小的前景物体或噪声,同时保持前景物体的总体位置和形状不变。结果存储在open_sun中。使用cv2.imshow函数显示开运算后的图像,窗口标题为'b'。
- 顶帽变换:使用cv2.morphologyEx函数对图像进行顶帽变换。顶帽变换是原始图像与开运算结果之间的差异,用于分离比周围亮的区域,通常用于突出显示图像的亮区域或前景物体。结果存储在tophat中。使用cv2.imshow函数显示顶帽变换后的图像,窗口标题为'c'。
- 闭运算:使用cv2.morphologyEx函数对图像进行闭运算。闭运算是先膨胀后腐蚀的过程,用于填充前景物体内部的小孔或小黑点,同时保持前景物体的总体位置和形状不变。结果存储在close_sun中。使用cv2.imshow函数显示闭运算后的图像,窗口标题为'd'。
- 黑帽变换:使用cv2.morphologyEx函数对图像进行黑帽变换。黑帽变换是闭运算结果与原始图像之间的差异,用于分离比周围暗的区域,通常用于突出显示图像的暗区域或背景。结果存储在blackhat中。使用cv2.imshow函数显示黑帽变换后的图像,窗口标题为'e'。
- 关闭所有窗口:使用cv2.destroyAllWindows函数关闭所有由OpenCV创建的窗口。
五、总结
图像形态学是数字图像处理中的一个重要分支,它通过一系列形态学操作实现对图像形状和结构的分析和处理。在OpenCV等计算机视觉库中,形态学操作被广泛应用于图像去噪、边缘检测、特征提取等任务中。