opencv学习(形态学操作)
目录
2,常见的形态学操作
1.什么是形态学操作
opencv的i形态学操作是基于图像形状的一系列处理方法,主要通过腐蚀(Erosion) 和膨胀(Dilation) 两个基本操作组合实现,常用于图像预处理(如去噪、分割)、边缘提取等场景。
OpenCV 提供了统一的形态学操作函数 cv2.morphologyEx()
,支持多种组合操作,语法如下:
src
:输入图像(通常为二值图像或灰度图像);op
:操作类型(如开运算、闭运算等);kernel
:结构元素(卷积核),用于定义操作的范围和形状;iterations
:操作迭代次数(默认 1 次,次数越多效果越强).
result = cv2.morphologyEx(src, op, kernel, iterations=1)
2,常见的形态学操作
腐蚀操作,膨胀操作,开运算,闭运算,梯度计算,礼帽与黑帽,如下:
import cv2import matplotlib as pltimport numpy as np\'\'\'形态学操作:图像类型:形态学操作通常用于二值图像(黑白分明),若处理彩色图像,需先转为灰度图再二值化。核的选择:根据目标形状选择核(如检测直线用十字核,通用场景用矩形核)。迭代次数:iterations 越大,操作效果越强(如多次腐蚀会严重缩小前景)。\'\'\'im=cv2.imread(\'persistence.jpg\')imag=cv2.resize(im,(0,0),fx=0.5,fy=0.5)#缩小比例cv2.imshow(\"persistence.jpg\",imag)cv2.waitKey(0)cv2.destroyAllWindows()#腐蚀操作(前景被背景腐蚀)\'\'\'腐蚀操作的原理:腐蚀操作会沿着图像中物体的边界进行 \"侵蚀\",具体来说,当卷积核在图像上滑动时,只有当卷积核覆盖区域内的所有像素都是前景像素时,中心像素才会被保留为前景,否则会被转换为背景。【前景通常指图像中的 “白色区域”(二值图像中,前景为 255,背景为 0)。】效果:图像中的白色区域(前景)会变小可以去除小的噪声点可以断开物体之间的细小连接使物体的边界变得更平滑\'\'\'kernel1=np.ones((5,5),np.uint8)#np.ones表示卷积核内所有元素的值都为1 ,np.uint8指定了数据类型为无符号 8 位整数(0-255)erosion_1=cv2.erode(imag,kernel1,iterations=5)#cv2.erode是 OpenCV 中实现腐蚀操作的函数,iterations表示迭代次数cv2.imshow(\'erosion_1\',erosion_1)cv2.waitKey(0)cv2.destroyAllWindows()#膨胀操作(与腐蚀操作相反,将前景变得更加突出)kernel2=np.ones((5,5),np.uint8)dilate1=cv2.dilate(imag,kernel2,iterations=2)#cv2.dilate是实现膨胀操作的函数cv2.imshow(\'dilate1\',dilate1)cv2.waitKey(0)cv2.destroyAllWindows()#开运算(先腐蚀再膨胀),应用于去除小噪声、断开细连接kernel3=np.ones((5,5),np.uint8)#cv2.morphologyEX表示形态学操作的函数,cv2.MORPH_OPEN表示开运算操作函数open1=cv2.morphologyEx(imag,cv2.MORPH_OPEN,kernel3)#没有iterations就默认迭代1次cv2.imshow(\"open1\",open1)cv2.waitKey(0)cv2.destroyAllWindows()#闭运算(先膨胀再腐蚀),应用于填充小空洞、连接近邻区域kernel4=np.ones((5,5),np.uint8)#cv2.MORPH_CLOSE表示闭运算操作函数close1=cv2.morphologyEx(imag,cv2.MORPH_CLOSE,kernel4)cv2.imshow(\'close1\',close1)cv2.waitKey(0)cv2.destroyAllWindows()#梯度运算(梯度=膨胀-腐蚀),用于提取前景边缘轮廓kernel5=np.ones((5,5),np.uint8)#cv2.MORPH_GRADIENTgradient1=cv2.morphologyEx(imag,cv2.MORPH_GRADIENT,kernel5,iterations=2)#指梯度运算迭代了2此cv2.imshow(\'gradient1\',gradient1)cv2.waitKey(0)cv2.destroyAllWindows()#礼帽(原始图像-开运算),用于分离比周围亮的小区域(如亮点噪声)kernel6=np.ones((5,5),np.uint8)#cv2.MORPH_TOPHATtophat1=cv2.morphologyEx(imag,cv2.MORPH_TOPHAT,kernel6)cv2.imshow(\'tophat1\',tophat1)cv2.waitKey(0),cv2.destroyAllWindows()#黑帽(闭运算-原始图像),用于分离比周围暗的小区域(如暗点噪声)kernel7=np.ones((5,5),np.uint8)#cv2.MORPH_BLACKHATblackhat1=cv2.morphologyEx(imag,cv2.MORPH_BLACKHAT,kernel7)cv2.imshow(\'b;ackhat1\',blackhat1)cv2.waitKey(0),cv2.destroyAllWindows()