openCV实战-系列教程3:形态学操作(腐蚀操作/膨胀操作/开运算/闭运算/梯度计算/礼帽和黑帽)、源码解读

🧡💛💚💙💜OpenCV实战系列总目录

1、腐蚀操作

1.1 腐蚀

首先读进来并打印一张图

img = cv2.imread('yzy.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 这个图片出现了一些毛刺,看着挺难受

执行一个腐蚀操作,再将图片打印出来:

kernel = np.ones((3,3),np.uint8) 
erosion = cv2.erode(img,kernel,iterations = 1)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

 毛刺全部没有了

1.2 腐蚀原理

再读进来一个圆形的图片

pie = cv2.imread('pie.png')

cv2.imshow('pie', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

在这个过程可以比较容易理解到腐蚀的原理,比如我们指定了一个(3,3)的卷积核kernel,他会将一个像素和周围的8个像素进行计算,如果是在这个图中,在黑色部分和白色部分的计算结果都会是不变的,因为卷积核内的所有像素都一样,而在黑白交界出的计算肯定会使得白色变黑了。

所以经过erode函数进行腐蚀操作,这个白色圈的外圈就会被腐蚀一部分,可以进行多次腐蚀操作:

kernel = np.ones((30,30),np.uint8) 
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

将白色圆的图片分别进行1、2、3次腐蚀:

 其中这个iterations就是指的是腐蚀次数

2、膨胀操作 

读进来前面的图片,进行腐蚀操作,腐蚀后的图像的毛刺没有了,但是线条也没有原来粗了。

使用dilate函数进行膨胀操作,并且将结果打印出来:

kernel = np.ones((3,3),np.uint8) 
yzy_erosion = cv2.erode(img,kernel,iterations = 1)

yzy_dilate = cv2.dilate(yzy_erosion,kernel,iterations = 1)

cv2.imshow('dilate', yzy_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

 膨胀后得结果,线条又变粗了。

将白色圆的图片分别进行1、2、3次膨胀:

pie = cv2.imread('pie.png')

kernel = np.ones((30,30),np.uint8) 
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

 打印结果:

 其中这个iterations就是指的是膨胀次数

3、开运算与闭运算

开运算就是把腐蚀、膨胀结合在一起

开运算:先腐蚀,再膨胀

闭运算: 先膨胀,再腐蚀

开运算:

morphologyEx函数,cv2.MORPH_OPEN参数

# 开:先腐蚀,再膨胀
img = cv2.imread('yzy.jpg')

kernel = np.ones((5,5),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

闭运算:

 morphologyEx函数,cv2.MORPH_CLOSE参数

# 闭:先膨胀,再腐蚀
img = cv2.imread('yzy.jpg')

kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

4、梯度运算

 梯度运算 = 膨胀-腐蚀

对刚刚的圆形图,先进行5次膨胀,然后进行5次腐蚀:

# 梯度=膨胀-腐蚀
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8) 
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)

res = np.hstack((dilate,erosion))

cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

 打印结果:

这两个图片再进行减法操作,现在我们肉眼应该能够判断出,这个结果应该是什么样子了,这就是梯度运算了。

直接对白色圆形图进行梯度运算操作:

gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

5、礼帽与黑帽

礼帽:原始图-开运算

黑帽:闭运算-原始图

礼帽

前面提到yzy.jpg这张图,原始图包含了一些毛刺,腐蚀后就没了毛刺,腐蚀再膨胀几乎就是原始图去掉了毛刺,这就是开运算操作,原始图再减去开运算的记过那不就只剩下原始图的那些毛刺了吗?

morphologyEx函数,cv2.MORPH_TOPHAT参数

#礼帽
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

 黑帽

morphologyEx函数,cv2.MORPH_BLACKHAT参数 

#黑帽
img = cv2.imread('yzy.jpg')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV是一个广泛用于计算机视觉和图像处理的开源库。腐蚀膨胀OpenCV中常用的图像处理操作之一,用于改变图像的形状和结构。 腐蚀(Erosion)是指通过对图像进行局部最小值操作来减小或磨损图像中的前景物体。它可以用于去除噪声或者分离连通的物体。 膨胀(Dilation)与腐蚀相反,通过对图像进行局部最大值操作来增加或扩大图像中的前景物体。它可以用于填充图像中的空洞或者连接连通的物体。 在OpenCV中,可以使用函数`cv2.erode()`进行腐蚀操作,使用函数`cv2.dilate()`进行膨胀操作。这两个函数需要传入待处理的图像和一个结构元素作为参数。结构元素定义了操作的形状和大小。 下面是一段示例代码,展示如何在OpenCV中使用腐蚀膨胀操作: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg', 0) # 定义结构元素 kernel = np.ones((5,5), np.uint8) # 腐蚀操作 erosion = cv2.erode(img, kernel, iterations=1) # 膨胀操作 dilation = cv2.dilate(img, kernel, iterations=1) # 显示结果 cv2.imshow('Erosion', erosion) cv2.imshow('Dilation', dilation) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这段代码中,我们首先读取了一张图像,然后定义了一个5x5的矩形结构元素。接下来,对图像进行了腐蚀膨胀操作,并使用`cv2.imshow()`函数显示了结果。 注意,腐蚀膨胀操作可以通过调整结构元素的大小和迭代次数来控制处理效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器学习杨卓越

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值