深度学习-OpenCv的运用(4)

打印 上一主题 下一主题

主题 647|帖子 647|积分 1951

一、图像形态学

图像形态学是数学中研究形状、结构和变换的一个分支,在图像处置惩罚领域,它主要用于形貌和分析图像中的形状和结构。图像形态学通过操纵图像中的形状和结构元素(也称为内核或模板),来实现图像的分析、增强、去噪和特征提取等目的。这一领域为计算机视觉、图像辨认和医学图像处置惩罚等领域提供了强大的工具和方法。
二、图像形态学的根本概念



  • 结构元素(Structuring Element):结构元素是形态学操纵的根本组成部分,它界说了形态学操纵的形状和大小。通常是一个小的矩形、圆形或其他形状的核。在腐蚀和膨胀等操纵中,结构元素在图像上滑动并与图像进行匹配,用来确定操纵的范围。
  • 腐蚀(Erosion):腐蚀是一种形态学操纵,它通过结构元素对图像进行局部最小值滤波,使图像中界限部分逐渐缩小。腐蚀操纵可以用于去除图像中的噪声、分割物体等。
  • 膨胀(Dilation):膨胀是一种形态学操纵,它通过结构元素对图像进行局部最大值滤波,使图像中的界限部分逐渐扩张。膨胀操纵可以用于添补图像中的空洞、连接物体等。
三、形态学操纵的主要类型



  • 腐蚀(Erosion):

    • 原理:使用结构元素在图像上滑动,只有当结构元素范围内的像素全部满足条件(如全为前景致)时,中心像素才保持不变,否则被置为背景致。
    • 应用:消除小型噪声、分离接触对象、细化物体边缘等。

  • 膨胀(Dilation):

    • 原理:使用结构元素在图像上滑动,只要结构元素与图像中的任何一个像素相交,中心像素就被设置为前景致。
    • 应用:添补图像中的空洞、连接相邻的对象、消除图像中的小黑点等。

  • 开运算(Opening):

    • 界说:先进行腐蚀操纵,再进行膨胀操纵的组合。
    • 应用:消除小型噪声、平滑较大物体的界限而不明显改变其面积。

  • 闭运算(Closing):

    • 界说:先进行膨胀操纵,再进行腐蚀操纵的组合。
    • 应用:添补物体间的小空洞、连接邻近的断裂物体等。

  • 形态学梯度(Morphological Gradient):

    • 界说:膨胀图像与腐蚀图像的差别,用于检测图像中的边缘和轮廓。

  • 顶帽运算(Top Hat)与底黑帽运算(Black Hat):

    • 顶帽运算是原始图像与开运算之间的差别,用于提取比原始图像更亮的区域。
    • 黑帽运算是闭运算与原始图像之间的差别,用于提取比原始图像更暗的区域。

四、代码实现

1.图像腐蚀

  1. import cv2
  2. import numpy as np
  3. sun = cv2.imread('sun.png')
  4. cv2.imshow('a', sun)
  5. cv2.waitKey(0)
  6. kernel = np.ones((5, 5), np.uint8) #设置kenenel大小
  7. erosion_1 = cv2.erode(sun, kernel, iterations=2) #kenenel大小默认为3*3 iterations默认为1
  8. cv2.imshow('erosion_1', erosion_1)
  9. cv2.waitKey(0)
  10. cv2.destroyAllWindows()
复制代码


  • 代码表明:设置了结构元素的大小为 5x5,并指定了腐蚀操纵的迭代次数为 2。这意味着腐蚀操纵将连续进行两次,每次都会使用5x5 的结构元素来减少图像中的亮区域。
  • 体现结果:使用 cv2.imshow 来体现原始图像和腐蚀后的图像。
  • 关闭窗口:在体现图像后,使用 cv2.waitKey(0)来等待用户按键。在 cv2.waitKey(0) 之后,调用cv2.destroyAllWindows() 来关闭全部 OpenCV 创建的窗口。
2.图像膨胀

  1. import cv2
  2. import numpy as np
  3. wenzi = cv2.imread('word.png')
  4. cv2.imshow('b', wenzi)
  5. cv2.waitKey(0)
  6. kernel = np.ones((2, 2), np.uint8)
  7. wenzi_new = cv2.dilate(wenzi, kernel, iterations=2)
  8. cv2.imshow('wenzi-new', wenzi_new)
  9. cv2.waitKey(0)
  10. cv2.destroyAllWindows()
复制代码


  • 读取并体现文件:使用cv2.imread函数读取名为’word.png’的图像文件,并将其存储在变量wenzi中,体现图像,窗口标题为’b’,图像为wenzi 。
  • 图像膨胀:创建一个2x2的结构元素,全部元素的值都设为1,这个结构元素将用于图像膨胀操纵 ,使用cv2.dilate函数对wenzi图像进行两次膨胀操纵。
  • 体现图像:使用cv2.imshow函数体现膨胀后的图像,窗口标题为’wenzi-new’ ,末了关闭窗口。
3.开运算-先腐蚀后膨胀

  1. import cv2
  2. import numpy as np
  3. zhiwen = cv2.imread('zhiwen1.png')
  4. cv2.imshow('a1',zhiwen)
  5. cv2.waitKey(0)
  6. kernel = np.ones((2,2),np.uint8)
  7. zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
  8. cv2.imshow('b1',zhiwen_new)
  9. cv2.waitKey(0)
  10. cv2.destroyAllWindows()
复制代码


  • 读取并体现文件:读取名为’zhiwen1.png’的图像文件,并将其存储在变量zhiwen中,使用cv2.imshow函数体现原始图像,窗口标题为’a1’ 。
  • 开运算操纵:创建一个2x2的结构元素,全部元素的值都设为1,使用cv2.morphologyEx函数对zhiwen图像进行形态学开运算。
  • 体现图像:使用cv2.imshow函数体现形态学开运算后的图像,窗口标题为’b1’,关闭全部OpenCV创建的窗口 。
4.闭运算-先膨胀后腐蚀

  1. import cv2
  2. import numpy as np
  3. zhiwen = cv2.imread('zhiwen2.png')
  4. cv2.imshow('a2',zhiwen)
  5. cv2.waitKey(0)
  6. kernel = np.ones((2,2),np.uint8)
  7. zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
  8. cv2.imshow('b2',zhiwen_new)
  9. cv2.waitKey(0)
  10. cv2.destroyAllWindows()
复制代码


  • 读取图像:使用cv2.imread函数读取名为zhiwen2.png的图像文件,并将其存储在变量zhiwen中。使用cv2.imshow函数体现原始图像。第一个参数是窗口的标题,这里设置为’a2’,第二个参数是要体现的图像,即zhiwen。
  • 闭运算操纵:创建一个2x2的结构元素(或称为核),全部元素的值都设为1。这个结构元素将用于形态学操纵。使用函数对zhiwen图像进行形态学闭运算。
  • 体现图像:使用cv2.imshow函数体现形态学开运算后的图像。窗口标题设置为’b2’,关闭全部由OpenCV创建的窗口。
5.梯度运算

  1. word = cv2.imread('word.png')
  2. cv2.imshow('a',word)
  3. cv2.waitKey(0)
  4. kernel = np.ones((2,2),np.uint8)
  5. #膨胀
  6. pz_word = cv2.dilate(word,kernel,iterations=2)
  7. cv2.imshow('b',pz_word)
  8. cv2.waitKey(0)
  9. #腐蚀
  10. fs_word = cv2.erode(word,kernel,iterations=1)
  11. cv2.imshow('c',fs_word)
  12. cv2.waitKey(0)
  13. # 膨胀-腐蚀
  14. word_new = cv2.morphologyEx(word,cv2.MORPH_GRADIENT,kernel)
  15. cv2.imshow('d',word_new)
  16. cv2.waitKey(0)
  17. cv2.destroyAllWindows()
复制代码


  • 膨胀操纵(cv2.dilate)会扩大图像中的亮区域(或白色区域),通常用于增强前景物体或连接相邻的亮区域。
  • 腐蚀操纵(cv2.erode)会缩小图像中的亮区域,通常用于去除小的白噪声或前景物体上的小黑点。
  • 形态学梯度(cv2.MORPH_GRADIENT)是膨胀后的图像与腐蚀后的图像之间的差别。它通常用于突出体现图像中物体的边缘,因为边缘区域在膨胀和腐蚀操纵中会经历最大的变化。

6.顶帽与黑帽

  1. sun = cv2.imread('sun.png')
  2. cv2.imshow('a', sun)
  3. cv2.waitKey(0)
  4. kernel = np.ones((2, 2), np.uint8)
  5. # 开运算
  6. open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
  7. cv2.imshow('b', open_sun)
  8. cv2.waitKey(0)
  9. # 顶帽
  10. tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
  11. cv2.imshow('c', tophat)
  12. cv2.waitKey(0)
  13. # 闭运算
  14. close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
  15. cv2.imshow('d', close_sun)
  16. cv2.waitKey(0)
  17. # 黑帽
  18. blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
  19. cv2.imshow('e', blackhat)
  20. cv2.waitKey(0)
  21. 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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表