目录
腐蚀
膨胀
开运算
闭运算
形态学梯度
礼帽
黑帽
形态学操作的关系
构建椭圆/圆形的核
就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉。这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的图像的所有像素值都是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()函数实现。
第一个参数表示输入图像。
第二个参数表示形态学操作的类型。
第三个参数表示定义的卷积核。
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()函数。
第一个参数表示核的形状。
第二个参数表示核的大小