一、形态学的基本概念
基本思想:用一定形态的结构元素去度量和提取图像中的对应形状,从而达到分析和识别的目的。
适用范围:图像的分割、特征抽取、边界检测
作用:这门学科在计算机文字识别,计算机显微图像分析,医学图像处理,工业检测等方面都取得了非常成功的应用。形态学方法已成为图像应用领域工程技术人员的必备工具。目前,有关数学形态学的技术和应用正在不断地研究和发展。
主要的数学基础:集合论
结构元素:形态学变换中的基本元素,是为了探测图像的某种结构信息而设计的特定形状和尺寸的图像,称为收集图像的结构信息的探针
结构元素类型:圆形、方型、线形、可以携带多汁知识进行探测。
利用上述结构元素在图像中逐点移动,看看这个像素满不满足某个结构的要求
结构元素本身就是图像
二、形态学算子
形态学运算:二值腐蚀、膨胀、二值开闭运算、骨架抽取、击中击不中变换等
形态学四个基本算子:膨胀、腐蚀、开启、闭合
腐蚀运算
什么是腐蚀运算呢?
概念:有一结构元素B和一副图像X,现在讲结构元素B逐点遍历,如果该点和其邻域与结构元素B全等,则保留该店,否则舍弃该点。
腐蚀运算有什么作用呢?
- 可以消除物体边界点,使边界向内部收缩。
- 可以把小于结构元素的物体去掉,选取不同大小的结构元素,去除不同大小 的物理。
水平方向的腐蚀
其结构元素形式如下
垂直方向的腐蚀
其结构元素如下
全方向腐蚀
代码实现
# 图像的腐蚀
def imageErosion(self,v,count=1):
for i in range(0,count):
self.__imageErosion__(v)
def __imageErosion__(self,v): #参数v为结构元素
width = len(v) #首先判断结构元素的大小
v_w=int(width/2) #得到中心点到边界的大小
img_buf=np.copy(self.Img) #开辟一个图像缓存区
# 可以使用模板的区域进行遍历
for y in range(v_w,self.f_height-v_w):
for x in range(v_w,self.f_width-v_w):
v_values=self.Img[y-v_w:y+v_w+1,x-v_w:x+v_w+1,0] # 得到所有像素元的值
if self.Img[y,x,0]==255:
continue
# 然后比较该像素点是否符合结构元素的特点
flag=False
for y_i in range(0,len(v_values)):
for x_i in range(0,len(v_values[y_i])):
v1=v[y_i][x_i]
p1=v_values[y_i][x_i]
if v1==0:
continue
elif v1==1 and p1==255:
flag=True
break
if flag:
break
if flag==True:
img_buf[y,x,:]=255
self.Img=img_buf
原图如下
效果图如下(水平腐蚀2次)
膨胀运算
什么是膨胀运算呢?
与腐蚀相反
注意:膨胀运算的结构元素与腐蚀运算的结构元素是一一对应的,可以通用
对二值化物体边界点扩充,将与物体接触的所有背景点合并到该物体中,使边界向外部扩展。
如果两个物体之间的距离比较近,可能会把两个物体连通到一起。
对填补图像分割后的物体空洞有作用。
注意腐蚀和膨胀并不互为逆运算,但是可以级连结合使用
简单点说,腐蚀作用要求图像上的某点元素的领域完全与结构元素相同才保留,而膨胀作用只要求某点元素的领域与结构元素有相交部分就保留,这里所指的保留是如果该点位背景点,则将其改变为物体点,如果是物体点,则还是不变。
代码实现
# 图像膨胀
def imageDilation(self,v,count=1):
for i in range(0,count):
self.__imageDilation__(v)
def __imageDilation__(self,v):
width = len(v) #首先判断结构元素的大小
v_w=int(width/2) #得到中心点到边界的大小
img_buf=np.copy(self.Img) #开辟一个图像缓存区
# 可以使用模板的区域进行遍历
for y in range(v_w,self.f_height-v_w):
for x in range(v_w,self.f_width-v_w):
v_values=self.Img[y-v_w:y+v_w+1,x-v_w:x+v_w+1,0] # 得到所有像素元的值
flag = False # 设置标记为FALSE
'下面对抽取的像素进行遍历'
for y_i in range(0,len(v_values)):
for x_i in range(0,len(v_values[y_i])):
v1=v[y_i][x_i] # 结构元素中的值
p1=v_values[y_i][x_i] # 抽取出来的像素里的值
if v1==0: #如果结构元素中的值为0,则说明这个地方为NULL。直接忽略
continue
elif (v1==1 and p1==0): #否则的话,判断结构元素中的点是否为物体,如果是,则满住膨胀条件
flag=True
break
if flag== True:
img_buf[y, x, :] = 0
break
self.Img=img_buf
原图如下
膨胀之后的图像(全方向腐蚀,5*5的结构元素大小)
三、图像的开启与闭合
基本概念
有膨胀和腐蚀两个运算的复合与集合操作组成的所有运算构成。
开运算:先对图像进行腐蚀运算,然后再对图像进行膨胀运算(使用同一结构元素)
闭运算:先对图像进行膨胀运算,然后再对图像进行腐蚀运算(使用同一结构元素)
作用
开运算:能够去除孤立的小点
,毛刺和小桥(连通两片区域的小点),消除小物体,平滑较大物体的边界。同时并不明显改变其面积。但是开运算后的图像与原图像不等
闭运算:先膨胀、后腐蚀,其功能是用来填充物体内细小的空洞,弥合小裂缝,同时并不明显改变其面积。但是闭运算后的图像与原图像不等