一、图像形态学
图像形态学是数学中研究形状、结构和变换的一个分支,在图像处置惩罚领域,它主要用于形貌和分析图像中的形状和结构。图像形态学通过操纵图像中的形状和结构元素(也称为内核或模板),来实现图像的分析、增强、去噪和特征提取等目的。这一领域为计算机视觉、图像辨认和医学图像处置惩罚等领域提供了强大的工具和方法。
二、图像形态学的根本概念
- 结构元素(Structuring Element):结构元素是形态学操纵的根本组成部分,它界说了形态学操纵的形状和大小。通常是一个小的矩形、圆形或其他形状的核。在腐蚀和膨胀等操纵中,结构元素在图像上滑动并与图像进行匹配,用来确定操纵的范围。
- 腐蚀(Erosion):腐蚀是一种形态学操纵,它通过结构元素对图像进行局部最小值滤波,使图像中界限部分逐渐缩小。腐蚀操纵可以用于去除图像中的噪声、分割物体等。
- 膨胀(Dilation):膨胀是一种形态学操纵,它通过结构元素对图像进行局部最大值滤波,使图像中的界限部分逐渐扩张。膨胀操纵可以用于添补图像中的空洞、连接物体等。
三、形态学操纵的主要类型
- 腐蚀(Erosion):
- 原理:使用结构元素在图像上滑动,只有当结构元素范围内的像素全部满足条件(如全为前景致)时,中心像素才保持不变,否则被置为背景致。
- 应用:消除小型噪声、分离接触对象、细化物体边缘等。
- 膨胀(Dilation):
- 原理:使用结构元素在图像上滑动,只要结构元素与图像中的任何一个像素相交,中心像素就被设置为前景致。
- 应用:添补图像中的空洞、连接相邻的对象、消除图像中的小黑点等。
- 开运算(Opening):
- 界说:先进行腐蚀操纵,再进行膨胀操纵的组合。
- 应用:消除小型噪声、平滑较大物体的界限而不明显改变其面积。
- 闭运算(Closing):
- 界说:先进行膨胀操纵,再进行腐蚀操纵的组合。
- 应用:添补物体间的小空洞、连接邻近的断裂物体等。
- 形态学梯度(Morphological Gradient):
- 界说:膨胀图像与腐蚀图像的差别,用于检测图像中的边缘和轮廓。
- 顶帽运算(Top Hat)与底黑帽运算(Black Hat):
- 顶帽运算是原始图像与开运算之间的差别,用于提取比原始图像更亮的区域。
- 黑帽运算是闭运算与原始图像之间的差别,用于提取比原始图像更暗的区域。
四、代码实现
1.图像腐蚀
- 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.图像膨胀
- 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.开运算-先腐蚀后膨胀
- 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.闭运算-先膨胀后腐蚀
- 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.梯度运算
- 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.顶帽与黑帽
- 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等计算机视觉库中,形态学操纵被广泛应用于图像去噪、边缘检测、特征提取等使命中。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |