OpenCV+python-----【形态学转换】

前言

形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,用来决定操作的性质。

两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,梯度等。我将以下图为例逐一进行这些操作。
在这里插入图片描述
后面的操作都会使用此图,先将此图读入,代码后面不再说明。

import cv2
import numpy as np
img = cv2.imread('dige.png')

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

腐蚀

原理: 我们使用卷积核沿着原始图像进行滑动,如果与卷积核所对应的原图像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则就变为零。如此一来,根据卷积核大小靠近前景的所有像素都会被腐蚀掉(变为 0),所以前景物体会变小,整幅图像的白色区域会减少。这对于去除白噪声很有用,也可以用来断开两个连在一块的物体等。

# 腐蚀
kernel = np.ones((3, 3), np.uint8)
erosion1 = cv2.erode(img, kernel, iterations=1)
erosion2 = cv2.erode(img, kernel, iterations=2)
res = np.hstack((img,erosion1,erosion2))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

自定义一个3×3的卷积核,iterations指的是迭代次数,这里进行了两次不同迭代次数的操作,来进行对比,并将其和原始图像一起显示,更加直观的进行理解。
在这里插入图片描述
从左到右分别为原始图像、1次迭代、2次迭代。可以看出,原始图像上“迪哥”周围的线条已经没有了,而且字也变得越来越细(白色区域减少)。

膨胀

原理: 与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是 1,中心元素的像素值就是 1。所以这个操作会增加图像中的白色区域,膨胀可以用来连接两个分开的物体。

# 膨胀

kernel = np.ones((3, 3), np.uint8)
dige_dilate1 = cv2.dilate(img, kernel, iterations=1)
dige_dilate2 = cv2.dilate(img, kernel, iterations=2)
res = np.hstack((img, dige_dilate1, dige_dilate2))
cv2.imshow('dilate', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

跟腐蚀同理,进行两次不同的迭代,并将三张图并排显示。
在这里插入图片描述
可以看出,随着不断的膨胀,字越来越粗(白色区域越来越多)。

开运算

原理: 先进行腐蚀再进行膨胀,可用来去除噪声。

# 开运算----->>> 先进行腐蚀,再进行膨胀
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
先对图像进行腐蚀后,周围的线条会腐蚀掉,同时整个字也会变细,再进行膨胀,字会变粗(跟原始的粗细一样),但字周围的线条不会再出现,也为去噪。

闭运算

原理: 先进行膨胀再进行腐蚀,可以用来填充前景物体中的小洞或小黑点。

# 闭运算------>>>先进行膨胀,再进行腐蚀
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
对于前景物体没有小黑点或小洞的没有什么效果。跟原始图像也没有什么区别。

我现在对原始图像涂点小黑点如下图所示,然后再进行测试下。
在这里插入图片描述
然后运行上述代码,别忘了改图片,结果如下:
在这里插入图片描述
可以很明显的看出来,前景物体上的小黑点已经没有了。它在膨胀的时候将其填充了,再进行腐蚀只会整体变少而不会出现之前的小黑点了。

形态学梯度运算

原理: 梯度运算 = 膨胀 - 腐蚀(用图像减法),提取的是物体边缘(轮廓)。

# 梯度运算
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述直观对比图如下(一目了然):
在这里插入图片描述

礼帽

原理: 礼帽 = 原始输入 - 开运算结果

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

在这里插入图片描述
开运算后得到的去除周围的线条的图像,用原始图像相减得到的便是这些线条。

黑帽

原理: 黑帽 = 闭运算 - 原始输入

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

在这里插入图片描述
【仅做记录】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值