目录
腐蚀
膨胀
开运算
闭运算
形态学梯度
礼帽
黑帽
形态学操作的关系
构建椭圆/圆形的核
腐蚀
就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉。这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的图像的所有像素值都是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()
文章来源地址https://www.toymoban.com/news/detail-447904.html
这里注意一个题外话,在使用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:十字交叉核
第二个参数表示核的大小
文章来源:https://www.toymoban.com/news/detail-447904.html
到了这里,关于OpenCv-Python学习笔记(九):形态学转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!