OpenCV学习笔记(4)——形态学操作
- 蒙面西红柿
- 1,525
形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。下面一起来了解数学形态学的概念。
数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。
膨胀与腐蚀能实现多种多样的功能,主要如下
- 消除噪声
- 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
- 寻找图像中的明显的极大值区域或极小值区域
- 求出图像的梯度
1.图像腐蚀
腐蚀就是求局部最小值的操作。就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。
这是怎么做到的呢?卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为零。
这会产生什么影响呢?根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为0),所以前景物体会变小,整幅图像的白色区域会减少。
这对于去除白噪声很有用,也可以用来断开两个连在一块的物体等。
#img2 = cv2.erode(img1, kernel, iterations)
#kernel:卷积核
#iterations:迭代次数,默认为1
#先用numpy生成一个5行5列的数组作为卷积核,里面的值为1
kernel = np.ones((5, 5), np.uint8)
img2 = cv2.erode(img1, kernel, iterations = 9)
2.图像膨胀
相反,膨胀就是求局部最大值的操作。
按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积。一般都会把腐蚀和膨胀对应起来理解和学习。
#img2 = cv2.dilate(img1, kernel, iterations)
kernel = np.ones((5, 5), np.uint8)
img2 = cv2.lidate(img1, kernel, 5)
3.开运算
先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。
#img2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#cv2.MORPH_OPEN:开运算
kernel = np.ones((5, 5), np.uint8)
img2 = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel)
- 开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不便。
- 开运算是一个基于几何运算的滤波器。
- 结构元素大小的不同将导致滤波效果的不同。
- 不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
4.闭运算
先膨胀后腐蚀。有助于关闭前景物体内部的小孔,或物体上的小黑点。
#img2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
#cv2.MORPH_CLOSE:闭运算
kernel = np.ones((5, 5), np.uint8)
img2 = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, kernel)
- 闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
- 闭运算是通过填充图像的凹角来滤波图像的。
- 结构元素大小的不同将导致滤波效果的不同。
- 不同结构元素的选择导致了不同的分割。
5.图像梯度
对原始图像分别进行膨胀与腐蚀,用膨胀结果减去腐蚀结果可以获得图像物体的轮廓。梯度 = 膨胀-腐蚀
#img2 = cv2.morphologyEx(img1, cv2.MORPH_GRADIENT, kernel)
#cv2.MORPH_GRADIENT:梯度
img2 = cv2.morphologyEx(img1, cv2.MORPH_GRADIENT, kernel)
6.图像礼帽
对原始图像进行开运算,用原图像减去开运算结果可以获得噪声图像。礼帽图像 = 原始图像-开运算图像
#img2 = cv2.morphologyEx(img1, cv2.MORPH_TOPHAT, kernel)
#cv2.MORPH_TOPHAT:梯度
img2 = cv2.morphologyEx(img1, cv2.MORPH_TOPHAT, kernel)
7.图像黑帽
对原始图像进行开运算,用原图像减去闭运算结果可以获得内部噪声图像。礼帽图像 = 原始图像-闭运算图像
#img2 = cv2.morphologyEx(img1, cv2.MORPH_BLACKHAT, kernel)
#cv2.MORPH_BLACKHAT:梯度
img2 = cv2.morphologyEx(img1, cv2.MORPH_BLACKHAT, kernel)
- MORPH_OPEN开运算
- MORPH_CLOSE闭运算
- MORPH_ERODE腐蚀
- MORPH_DILATE膨胀
- MORPH_GRADIENT图像梯度
- MORPH_TOPHAT顶帽
- MORPH_BLACKHAT黑帽
文章评论