当前位置: 首页 > biancheng >正文

opencv从入门到精通 哦吼08

目录

腐蚀与膨胀

腐蚀

膨胀

开运算

形态学运算

梯度运算

顶帽运算

黑帽运算

小结


腐蚀与膨胀

腐蚀和膨胀是图像形态学中的两种核心操作,通过这两种操作可以清除或强化图像中的细节。合理使用腐蚀和膨胀,还可以实现图像开运算、闭运算、梯度运算、顶帽运算和黑帽运算等极具特点的操作。下面将对腐蚀、膨胀以及其他形态学操作进行详细的介绍。

腐蚀

腐蚀操作可以让图像沿着自己的边界向内收缩。OpenCV 通过「核」来实现收缩计算。「核」的英文名为 kernel,在形态学中可以理解为「由n个像素组成的像素块」,像素块包含一个核心(核心通常在中央位置,也可以定义在其他位置)。像素块在图像的边缘移动,在移动过程中,核会将图像边缘那些与核重合但又没有越过核心的像素点都抹除,效果类似图 12.1 所示的过程,就像削土豆皮一样,将图像一层一层地「削薄」。

OpenCV 将腐蚀操作封装成 erode()方法,该方法的语法如下

  dst = cv2.erode(src, kernel, anchor, iterations, borderType, borderValue)

图像经过腐蚀操作之后,可以抹除一些外部的细节,如图是一个仙人掌,经过腐蚀操作之后 可以将外部的刺去除

import cv2
import numpy as  np

image=cv2.imread('match/img_1.png')
k=np.ones((5,5),np.uint8)
cv2.imshow('image',image)
dst=cv2.erode(image,k)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

膨胀

膨胀操作与腐蚀操作相反,膨胀操作可以让图像沿着自己的边界向内扩张。同样是通过核来计算,当核在图像的边缘移动时,核会将图像边缘填补新的像素,效果类似图 12.6 所示的过程,就像在一面墙上反反复复地涂水泥,让墙变得越来越厚。

OpenCV 将膨胀操作封装成 dilate()方法,该方法的语法如下:

  dst = cv2.dilate(src, kernel, anchor, iterations, borderType, borderValue)

图像经过膨胀操作之后,可以放大一些外部的细节,消除内部细节

import cv2
import numpy as np
image=cv2.imread('match/img_2.png')
k=np.ones((3,3),np.uint8)
cv2.imshow('image',image)
dst=cv2.dilate(image,k)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

开运算

开运算是将图像先进行腐蚀操作,再进行膨胀操作。开运算可以用来抹除图像外部的细节(或者噪声)。

# 开运算
'''
开运算是将图像先进性腐蚀操作,再进行膨胀操作,
可以用来抹除图像外部的细节
'''
import  cv2
import numpy as np
img=cv2.imread('match/img_4.png')
k=np.ones((5,5),np.uint8)
cv2.imshow('img',img)
dst=cv2.erode(img,k)
dst1=cv2.dilate(dst,k)
cv2.imshow('dst1',dst1)
cv2.waitKey(0)
cv2.destroyAllWindows()

#但是 运算完之后 图片就变得比较模糊了

#闭运算 则是反过来  抹去图像内部细节

闭运算就是反过来 去除图象的内部细节

形态学运算

腐蚀和膨胀是形态学的基础操作,除了开运算和闭运算以外,形态学中还有几种比较有特点的运算。OpenCV 提供了一个 morphologyEx()形态学方法,包含所有常用的运算,其语法如下:

 dst = cv2.morphologyEx(src, op, kernel, anchor, iterations, borderType, borderV

 

morphologyEx()方法实现的腐蚀、膨胀、开运算和闭运算效果与前文中介绍的效果完全一致,本节不再赘述,下面将介绍 3 个特点鲜明的操作:梯度运算、顶帽运算和黑帽运算。

梯度运算

这里的梯度是指图像梯度,可以简单地理解为像素的变化程度。如果几个连续的像素,其像素值跨度越大,则梯度值越大。

梯度运算的运算过程如图 12.15 所示,让原图的膨胀图减原图的腐蚀图。因为膨胀图比原图大,腐蚀图比原图小,利用腐蚀图将膨胀图掏空,就得到了原图的轮廓图。

说明

梯度运算中得到的轮廓图只是一个大概轮廓,不精准。

import cv2
import numpy as np
img=cv2.imread('match/img_6.png')
k=np.ones((5,5),np.uint8)
cv2.imshow('img',img)
dst=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,k)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

顶帽运算

顶帽运算的运算过程如图 12.17 所示,让原图减原图的开运算图。因为开运算抹除图像的外部细节,「有外部细节」的图像减去「无外部细节」的图像,得到的结果就只剩外部细节了,所以经过顶帽运算之后,小蜘蛛就只剩蜘蛛腿了。

黑帽运算

黑帽运算的运算过程如图 12.19 所示,让原图的闭运算图减去原图。因为闭运算抹除图像的内部细节,「无内部细节」的图像减去「有内部细节」的图像,得到的结果就只剩内部细节了,所以经过黑帽运算之后,小蜘蛛就只剩下斑点、花纹和眼睛了。

import cv2
import numpy
import numpy as np

img=cv2.imread('match/img_6.png')
k=np.ones((5,5),np.uint8)
cv2.imshow('img',img)
dst=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,k)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

小结

本章介绍的基础内容是腐蚀和膨胀。读者掌握了其用法,就能轻而易举地实现开运算和闭运算。其中,开运算是对图像先进行腐蚀操作,再进行膨胀操作,其作用是抹除图像外部的细节;而闭运算是对图像先进行膨胀操作,再进行腐蚀操作,其作用是抹除图像内部的细节。此外,形态学运算也是构建在腐蚀和膨胀的基础上的。其中,梯度运算是让原图的膨胀图减原图的腐蚀图,得到的结果是原图的轮廓;顶帽运算是让原图减原图的开运算图,得到的结果是图像的外部细节;黑帽运算是让原图的闭运算图减去原图,得到的结果是图像的内部细节。

相关文章:

  • 牛客练习赛#84 F 莫比乌斯反演+杜教筛+技巧+斐波那契数列和gcd的结论+矩阵快速幂
  • ZZNUOJ_用C语言编写程序实现1342:支配值数目(附完整源码)
  • java毕业设计后勤管理系统餐饮评价监督系统(附源码、数据库)
  • 前端基础学习笔记
  • 【TS】联合类型--类型断言--类型推断
  • 谈笑风声的秘密
  • QT影城网上售票系统
  • NetCDF数据在ArcMap中的使用
  • 打怪升级(考验思路)
  • 持续精进,改变自己