形态学,主要从图像类提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义。腐蚀是最基本的形态学操作之一。
形态学概述
形态学,主要从图像类提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义。通常是图像理解时所使用的最本质的形状特征。例如在识别手写数字,在具体识别时,仅针对其骨架进行运算即可。
形态学操作主要包括腐蚀、膨胀、开运算、闭运算、形态学梯度、礼貌运算、黑帽运算等操作。
腐蚀操作和膨胀操作是形态学运算的基础,将腐蚀和膨胀操作进行结合,就可以实现开运算、闭运算等。
腐蚀
腐蚀能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。腐蚀用来收缩或者细化二值图像中的前景,借此消除噪声元素分割等功能。
基本原理
需要了解概念:前景色和背景色。在上图中,前景色就是白色,背景色就是黑色。
- 如果结构元完全处于前景图像中,就将结构元中心所对应的腐蚀结果图像中的像素点处理为前景色。
- 如果结构元未完全处于前景图像中(可能部分在,可能完全不在),就将结构元中心所对应的腐蚀结果图像中的像素点处理为背景色。
结构元也被称作“核”。
代码示例:
import cv2
import numpy as np
img = np.zeros((5,5),np.uint8) #原图(背景)
img[1:4,1:4] = 1 #前景
kernel = np.ones((3,1),np.uint8) #核
erosion = cv2.erode(img,kernel) #腐蚀结果
print('IMG=',img)
print('kernel=',kernel)
print('EROSION=',erosion)
运行结果:
IMG= [[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]
kernel= [[1]
[1]
[1]]
EROSION= [[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 1 0]
[0 0 0 0 0]
[0 0 0 0 0]]
语法
使用cv2.erode()
实现腐蚀操作。
dst = cv2.erode( src, kernel, [,anchor,[,iterations,[,boederType]]])
腐蚀示例
例1:使用函数cv2.erode()
完成图像腐蚀。
import cv2
import numpy as np
img = cv2.imread('E:\Blog\OpenCV\jian.png',0) #原图(背景)
kernel1 = np.ones((5,5),np.uint8) #核1,小核
kernel2 = np.ones((15,15),np.uint8) #核2,大核
erosion1 = cv2.erode(img,kernel1) #腐蚀结果1
erosion2 = cv2.erode(img,kernel2) #腐蚀结果2
cv2.imshow('IMG',img)
cv2.imshow('EROSION',erosion1)
cv2.imshow('EROSION2',erosion2)
cv2.waitKey()
需要注意的是,核要适合大小即可,太小可能导致效果不好,太大会导致直接失真,变得很瘦
素材: