目录
一、腐蚀
二、膨胀
三、开运算
四、闭运算
五、形态学梯度
六、Top-Hat
七、Black-Hot
八、形态学操作之间的关系
九、构造结构化元素(核)
形态学转换原理:一般情况下对二值化图像进行操作。需要两个参数,一个是原始图像,另一个是结构化元素(核),它是用来决定操作的性质的。基本操作为腐蚀和膨胀,他们的变体构成了开运算、闭运算、梯度等
谢谢这朵小花!!!
一、腐蚀
把前景物体的边界腐蚀掉,但是前景依然是白色的。卷积核沿着图像滑动,如果与卷积核对应的原始图片的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为0),所以前景物体会变小,整幅图片的白色区域会减少。
这对于除去白噪声很有用,也可以用来断开两个连在一起的物体。
cv2.erode(img,kernel,iterations=1)
- iterations:迭代数
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)
image = np.hstack((img,erosion))
while True:
cv2.imshow('image',image)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
二、膨胀
与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是1,中心元素的像素值就是1.所以这个操作会增加图像中白色区域(前景)。一般在去噪声时先腐蚀再膨胀。因为腐蚀再去掉白噪声的同时,也会使得前景对象变小,所以我们再膨胀。这时候噪声已经去除了,但是前景还在增加,膨胀也可以用来连接两个分开的物体。
cv2.dilate(img,kernel,iterations=1)
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(img,kernel,iterations=1)
image = np.hstack((img,dilation))
while True:
cv2.imshow('image',image)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
三、开运算
先进行腐蚀再进行膨胀
被用来去除噪声
cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
image = np.hstack((img,opening))
while True:
cv2.imshow('image',image)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
四、闭运算
先膨胀后腐蚀
被用来填充前景物体中的小洞,或者是前景中的小黑点
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
image = np.hstack((img,closing))
while True:
cv2.imshow('image',image)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
五、形态学梯度
其实就是一幅图像膨胀和腐蚀的差别所展现的样子,结果看上去像是前景物体的轮廓
cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
image = np.hstack((img,gradient))
while True:
cv2.imshow('image',image)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
六、Top-Hat
原始图像与开运算之后得到的图像之间的差别
cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
image = np.hstack((img,tophat))
while True:
cv2.imshow('image',image)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
七、Black-Hot
原始图像与闭运算之后得到的图像之间的差别
cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
image = np.hstack((img,blackhat))
while True:
cv2.imshow('image',image)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
八、形态学操作之间的关系
九、构造结构化元素(核)
之前的例子都是使用numpy构建的结构化元素,都是正方形的。
但是如果需要构建椭圆形或者是圆形的核,可以使用cv2.getStructuringElement(),只需要说明清楚核的形状和大小
import cv2
import numpy as np
rectangular_kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
ellipticalr_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
cross_shapedr_kernel= cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
print('\nrectangularr_kernel\n',rectangularr_kernel)
print('\nellipticalr_kernel\n',ellipticalr_kernel)
print('\ncross_shapedr_kernel\n',cross_shapedr_kernel)