- 腐蚀
- 膨胀
- 开运算
- 闭运算
- 形态学梯度运算
- 顶帽运算(礼帽运算)
- 黑帽运算
- 腐蚀操作和膨胀操作是形态运算的基础,将腐蚀和膨胀操作进行结合,就可以实现开运算、闭运算、形态学梯度运算、顶帽运算、黑帽运算、击中击不中等部同形式的运算。
腐蚀
- dst=cv2.erode(src, kernel, [,anchor[,iterations[,borderType[,borderValue]]]])
- 式中:
- dst:是腐蚀后所输出的目标图像,该图像和原始图像具有同样的类型和大小
- src:是需要进行腐蚀的原始图像,图像的通道数可以是任意的。
- kernel:代表腐蚀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
- anchor:代表element结构中锚点的位置。该值默认为(-1,-1),在核中心位置
- iterations:是腐蚀操作迭代的次数,默认为1。
- borderType:代表边界样式。
- borderValue:代表边界值。
1 2 3 4 5 6 7 8
| import cv2 import numpy as np from get_show_img import get_show
img = cv2.imread('data/fs.png') kernel = np.ones((5,5), np.uint8) erosion=cv2.erode(img, kernel, iterations=5) get_show(img, erosion)
|
膨胀
- dst=cv2.dilate(src, kernel[,anchor[,iterations[,borderType[,borderValue]]]])
- 式中:
- dst:代表膨胀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
- src:代表需要进行膨胀操作的原始图像。
- element:代表膨胀操作所采用的结构类型。它可以自定义生成,也可以自定义生成,也可以通过函数cv2.getStructringElement()生成。
1 2 3 4 5 6 7 8
| import cv2 import numpy as np from get_show_img import get_show
img = cv2.imread('data/pz.jpg') kernel = np.ones((5,5), np.uint8) erosion=cv2.dilate(img, kernel, iterations=9) get_show(img, erosion)
|
通用形态学函数
- dst=cv2.morphologyEx(src,op,kernel[,anchor[,iterations[,borderType[,borderValue]]]])
- dst:代表经过形态学操作所输出的图像
- src:代表需要进行形态学操作的原始图像。
- op:代表操作类型。
- op类型选择:
腐蚀
1 2 3 4 5 6 7
| import cv2 import numpy as np
img = cv2.imread('data/fs.png') kernel = np.ones([5,5], dtype=np.uint8) rst = cv2.morphologyEx(img, cv2.MORPH_ERODE, kernel, iterations=2) get_show(img, rst)
|
膨胀
1 2 3 4 5 6 7
| import cv2 import numpy as np
img = cv2.imread('data/fs.png') kernel = np.ones([5,5], dtype=np.uint8) rst = cv2.morphologyEx(img, cv2.MORPH_DILATE, kernel, iterations=2) get_show(img, rst)
|
开运算
1 2 3 4 5 6 7
| import cv2 import numpy as np
img = cv2.imread('data/fs.png') kernel = np.ones([5,5], dtype=np.uint8) rst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=2) get_show(img, rst)
|
闭运算
- 先膨胀再腐蚀,有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同前景图像进行连接
1 2 3 4 5 6 7
| import cv2 import numpy as np
img = cv2.imread('data/fs.png') kernel = np.ones([5,5], dtype=np.uint8) rst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2) get_show(img, rst)
|
形态学梯度运算
- 膨胀图减去腐蚀图,可以获取原始图像中前景图像的边缘
1 2 3 4 5 6 7
| import cv2 import numpy as np
img = cv2.imread('data/fs.png') kernel = np.ones([5,5], dtype=np.uint8) rst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) get_show(img, rst)
|
顶帽运算(礼帽运算)
- 原始图像减去开运算所得图像,能够获取图像的噪声信息
1 2 3 4 5 6 7
| import cv2 import numpy as np
img = cv2.imread('data/fs.png') kernel = np.ones([5,5], dtype=np.uint8) rst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) get_show(img, rst)
|
黑帽运算
1 2 3 4 5 6 7
| import cv2 import numpy as np
img = cv2.imread('data/fs.png') kernel = np.ones([5,5], dtype=np.uint8) rst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=5) get_show(img, rst)
|
击中击不中
- 前景背景腐蚀运算的交集,仅支持CV_8UC1二进制图像
1 2 3 4 5 6 7 8
| import cv2 import numpy as np
img = cv2.imread('data/fs.png', 0) kernel = np.ones([5,5], dtype=np.uint8)
rst = cv2.morphologyEx(img, cv2.MORPH_HITMISS, kernel, iterations=5) get_show(img, rst)
|
核函数
使用cv2.getStructuringElement()生成不同结构的核
矩形核
1
| kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
|
十字形核
1
| kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (10, 10))
|
椭圆核
1
| kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1000, 1000))
|