OpenCv-Python学习笔记(九):形态学转换

目录

腐蚀

膨胀

开运算

闭运算

形态学梯度

礼帽

黑帽

形态学操作的关系

构建椭圆/圆形的核


形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进 行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或 核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀。他们 的变体构成了开运算,闭运算,梯度等。

腐蚀

就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉。这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的图像的所有像素值都是1,那么该区域的所有像素值就是1,否则为0。用于去除白噪声和断开两个连在一起的物体等。用到的函数是cv2.erode()

第一个参数表示输入图像。

第二个参数表示定义的卷积核。

第三个参数表示迭代腐蚀的次数,通俗的说就是腐蚀多少次。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('../data/image/13.png',0)
"""腐蚀"""
#创建一个5*5的值为1的卷积核
kernel = np.ones((5,5),np.uint8)
#腐蚀运算,iteration=1,迭代腐蚀1次
erosion = cv2.erode(img,kernel,iterations=1)
#显示原图
plt.subplot(1,2,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
#显示腐蚀后的图
plt.subplot(1,2,2),plt.imshow(erosion,cmap ="gray")
plt.title("corrosion")
plt.show()

 

这里注意一个题外话,在使用plt.imshow()函数显示二值图像时,需要设置cmap = "gary",否则显示是不正常的彩色图像,如:

膨胀

膨胀与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是1,那么该区域的所有像素点的值都为1。所以膨胀会增加图像的白色区域。一般在去噪声时,先用腐蚀在膨胀,因为腐蚀在去掉白噪声的同时,也会使前景对象变小,所以使用膨胀放大前景。用到的函数是cv2.dilate()

第一个参数表示原图像。

第二个参数表示定义的卷积核。

第三个参数表示迭代膨胀的次数。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('../data/image/13.png',0)

#创建一个5*5的值为1的卷积核
kernel = np.ones((5,5),np.uint8)
#iteration=1,迭代膨胀1次
dilation = cv2.dilate(img,kernel,iterations = 1)
#显示原图
plt.subplot(1,2,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
#显示处理后的图
plt.subplot(1,2,2),plt.imshow(dilation,cmap ="gray")
plt.title("dilation")
plt.show()

 

开运算

先进行腐蚀运算再进行膨胀运算就叫做开运算,被用来去除噪声。可以先调用腐蚀函数,在调用膨胀函数,也可以直接使用cv2.morphologyEx()函数实现。

第一个参数表示输入图像。

第二个参数表示形态学操作的类型。

  • cv2.MORPH_OPEN:开运算
  • cv2.MOPRH_CLOSE:闭运算
  • cv2.MPRPH_GRADIENT:形态学梯度
  • cv2.MORPH_TOPHAT:礼帽
  • cv2.MORPH_BLACKHAT:黑帽

第三个参数表示定义的卷积核。

 

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('../data/image/14.png')
img1= cv2.imread('../data/image/15.png')
img2= cv2.imread('../data/image/13.png')
#创建一个7*7的值为1的卷积核
kernel = np.ones((7,7),np.uint8)
"""开运算"""
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
"""闭运算"""
closing = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, kernel)
"""形态学梯度"""
gradient = cv2.morphologyEx(img2, cv2.MORPH_GRADIENT, kernel)
#显示原图
plt.subplot(3,2,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
#显示处理后的图
plt.subplot(3,2,2),plt.imshow(opening,cmap ="gray")
plt.title("opening")

plt.subplot(3,2,3),plt.imshow(img1,cmap = "gray")
plt.title("Original")
#显示处理后的图
plt.subplot(3,2,4),plt.imshow(closing,cmap ="gray")
plt.title("closing")

plt.subplot(3,2,5),plt.imshow(img2,cmap = "gray")
plt.title("Original")
#显示处理后的图
plt.subplot(3,2,6),plt.imshow(gradient,cmap ="gray")
plt.title("gradient")
plt.show()

闭运算

先进行膨胀运算再进行腐蚀运算就叫做闭运算,被用来填充前景物体中的小洞,或者前景物体上的小黑点。程序和函数参数见开运算

形态学梯度

结果像是前景物体的轮廓,像是膨胀的结果减去腐蚀的结果。程序和函数参数见开运算

礼帽

原始图像与进行开运算之后的图像的差。函数参数见开运算。下面的例子对比了使用使用函数计算的结果和不使用函数计算的结果是否相同。

img = cv2.imread('../data/image/13.png')
#创建一个11*11的值为1的卷积核
kernel = np.ones((11,11),np.uint8)
#开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#原图像减去开运算后的图
tophat1 = img - opening
#礼帽
tophat2 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

plt.subplot(1,4,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
plt.subplot(1,4,2),plt.imshow(opening ,cmap = "gray")
plt.title("Opening")
plt.subplot(1,4,3),plt.imshow(tophat1,cmap = "gray")
plt.title("tophat1")
plt.subplot(1,4,4),plt.imshow(tophat2,cmap = "gray")
plt.title("tophat2")
plt.show()

 

 

黑帽

进行闭运算之后的图像与原始图像的差。

img = cv2.imread('../data/image/13.png')
#创建一个11*11的值为1的卷积核
kernel = np.ones((11,11),np.uint8)
#闭运算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
#闭运算减去原图像
blackhat1 =closing - img
#礼帽
blackhat2 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

plt.subplot(1,4,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
plt.subplot(1,4,2),plt.imshow(closing,cmap = "gray")
plt.title("closing")
plt.subplot(1,4,3),plt.imshow(blackhat1,cmap = "gray")
plt.title("blackhat1")
plt.subplot(1,4,4),plt.imshow(blackhat2,cmap = "gray")
plt.title("blackhat2")
plt.show()

 

形态学操作的关系

开运算 = 先腐蚀,后膨胀

闭运算 = 先膨胀,后腐蚀

形态学梯度 = 膨胀 - 腐蚀

礼帽 = 原图 - 开运算

黑帽 = 闭运算 - 原图

构建椭圆/圆形的核

使用cv2.getStructuringElement()函数。

第一个参数表示核的形状。

  • cv2.MOPRH_RECT:矩形核
  • cv2.MORPH_ELLIPSE:椭圆核
  • cv2.MORPH_CROSS:十字交叉核

第二个参数表示核的大小

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值