图像形态学操作


形态学是从图像中提取分量信息,得到图像最本质的特征。形态学操作主要包括:腐蚀,膨胀,开运算,闭运算,,形态学梯度,礼帽运算,黑帽运算。腐蚀和膨胀是基础,其他运算都是二者的混合运算。

一.腐蚀

顾名思义,所谓腐蚀就是清除掉图像的一些毛刺和细节。其本质上也是一种空间滤波,设定一个掩模,掩模中心逐次滑过每一个像素点,当前像素点(即掩模中心所对应的位置)的值设为掩模覆盖区域中像素的最小值。
opencv中提供的腐蚀处理函数为cv2.erode(),其语法格式为:

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

参数说明:
dst:目标输出图像
src:原始输入图像
kernel:核即掩模的结构,可以自定义生成。
anchor:瞄点,即当前像素点在掩模中的对应位置,一般默认为(-1,-1),即在核的中心。
iteration:迭代次数,即进行掩模的次数。
borderType:边间像素的处理方式。
使用数组演示掩模的原理:

import cv2
import numpy as np
arr=np.zeros((5,5),dtype=np.uint8)
arr[1:4,1:4]=1
kernel=np.array([[1],[1],[1]])
arr1=cv2.erode(arr,kernel)
print("arr",arr)
print("arr1",arr1)

运行结果:
在这里插入图片描述

image=np.ones((5,5),dtype=np.uint8)
image[2,1:4]=0
image1=cv2.erode(image,kernel)
print("image",image)
print("image1",image1)

运行结果:
在这里插入图片描述

用图像演示掩模的效果:

image=cv2.imread("wb3.png")
kernel=np.ones((3,3))
erosion=cv2.erode(image,kernel)
cv2.imshow("image",image)
cv2.imshow("erosion",erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

二.膨胀

顾名思义,所谓膨胀就是扩大图像的一些毛刺和细节。其本质上也是一种空间滤波,设定一个掩模,掩模中心逐次滑过每一个像素点,当前像素点(即掩模中心所对应的位置)的值设为掩模覆盖区域中像素的最大值。
opencv中提供的腐蚀处理函数为cv2dilate(),其语法格式为:

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

参数说明:
dst:目标输出图像
src:原始输入图像
kernel:核即掩模的结构,可以自定义生成。
anchor:瞄点,即当前像素点在掩模中的对应位置,一般默认为(-1,-1),即在核的中心。
iteration:迭代次数,即进行掩模的次数。
borderType:边间像素的处理方式。
使用数组演示掩模的原理:

import cv2
import numpy as np
arr=np.zeros((5,5),dtype=np.uint8)
arr[1:4,1:4]=255
kernel=np.array([[1],[1],[1]])
arr1=cv2.dilate(arr,kernel)
print("arr",arr)
print("arr1",arr1)

运行结果:
在这里插入图片描述
用图像演示掩模的效果:

image=cv2.imread("wb3.png")
kernel=np.ones((3,3))
erosion=cv2.dilate(image,kernel,iterations=5)
cv2.imshow("image",image)
cv2.imshow("erosion",erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

三.通用形态学操作函数

其他形态学操作为以上两种操作的不同组合,opencv提供了通用性形态学操作函数cv2.morphologyEx(),其可以通过不同参数实现不同的操作。
函数语法格式:

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

参数说明:
dst:目标输出图像
src:原始输入图像
op:代表操作类型,常见形式有:
在这里插入图片描述
kernel:核即掩模的结构,可以自定义生成。
anchor:瞄点,即当前像素点在掩模中的对应位置,一般默认为(-1,-1),即在核的中心。
iteration:迭代次数,即进行掩模的次数。
borderType:边间像素的处理方式。

四.开运算

开运算是先将图像腐蚀,在对腐蚀的图像进行膨胀。其可以用于去噪,即先腐蚀去噪,在膨胀,使图像除噪声外的其他点恢复原状。还可以用于计数,因为其可以将图像中相连的地方进行分开。
用于去噪:

image=cv2.imread("wb1.png")
image=255-image
kernel=np.ones((3,3))
after=cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel)
cv2.imshow("image",image)
cv2.imshow("after",after)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

五.闭操作

闭操作与开操作相反,其是先进膨胀,再对膨胀后的图像进行腐蚀。其可以用于取出图像内部的一些小黑点,也可以将两个相距很近的图形进行相连。

1.去除黑点

image=cv2.imread("wb6.png")
image=255-image
kernel=np.ones((9,9))
after=cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel)
cv2.imshow("image",image)
cv2.imshow("after",after)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

2.将断开物体相连

image=cv2.imread("wb5.png")
image=255-image
kernel=np.ones((50,50))
after=cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel)
cv2.imshow("image",image)
cv2.imshow("after",after)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述
#六.形态学梯度
梯度就是用膨胀后的图像减去腐蚀后的图像,这样就可以得到原始图像的边界。

image=cv2.imread("wb6.png")
image=255-image
kernel=np.ones((5,5))
gradient=cv2.morphologyEx(image,cv2.MORPH_GRADIENT,kernel)
cv2.imshow("image",image)
cv2.imshow("after",gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

七.礼帽操作

礼帽就是用原始图像减去开运算后的结果,这样就可以得到原始图像的噪声信息。

image=cv2.imread("wb3.png")
kernel=np.ones((5,5))
tophat=cv2.morphologyEx(image,cv2.MORPH_TOPHAT,kernel)
cv2.imshow("image",image)
cv2.imshow("after",tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

七.黑帽操作

礼帽就是用闭运算的结果减去原始图像的结果,这样就可以得到原始图像的黑点或小孔信息。

image=cv2.imread("wb6.png")
image=255-image
kernel=np.ones((5,5))
after=cv2.morphologyEx(image,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow("image",image)
cv2.imshow("after",after)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值