细化算法
“骨架”是指一幅图像的骨骼部分,描述物体的几何形状和拓扑结构,是重要的图像描绘子之一。计算骨架的过程一般被称为“细化”或“骨骼化”,对目标物体进行细化有助于突出目标的形状特点和拓扑结构,减少冗余的信息。
思路:我们假定一个图像的3×3区域标记为P1,P2,....,P9,如下,
· | · | · | · |
---|---|---|---|
· | P3 | P2 | P9 |
· | P4 | P1 | P8 |
· | P5 | P6 | P7 |
规定1表示黑色,0表示白色,如果中心P1=1(为黑),若同时满足下列4个条件,则删除P1(令P1=0),
- 2<=NZ(P1)<=6;
- Z0(P1)=1;
- P2×P4×P8=0或者Z0(P1)不等于1;
- P2×P4×P6=0或者Z0(P4)不等于1;
其中,NZ(P)表示P点的8邻域中1的数目,如下表所示,
· | · | · | · |
---|---|---|---|
· | P-1,-1 | P-1,0 | P-1,1 |
· | P0,-1 | P0,0 | P0,1 |
· | P1,-1 | P1,0 | P1,1 |
而Z0(P)按照以下方式计算,
nCount=0;
if P-1,0=0 && P-1,-1=1
nCount++;
if P-1,-1=0 && P0,-1=0
nCount++;
if P0,-1=0 && P1,-1=1
nCount++;
if P1,-1=0 && P1,0=1
nCount++;
if P1,0=0 && P1,1=1
nCount++;
if P1,1=0 && P0,1=1
nCount++;
if P0,1=0 && P-1,1=1
nCount++;
if P-1,1=0 && P-1,0=1
nCount++;
Z0(P)=nCount;
而后对图像中的每一个点都进行重复这些步骤,直到所有的点都不可删除为止。
像素化算法
细化通常适用于和物体拓扑结构或形状有关的应用,比如手写字符识别等,但有时候关心的是目标对象是否存在,它们的位置关系或者是个数,这个时候我们就可以用像素化的方法进行预处理。
像素化的操作就是先找到在二值图像中所有的连通区域,然后用这些区域的质心作为这些连通区域的代表,即将一个连通区域化为位于连通区域质心的一个像素。
有时候为了过滤噪声,我们可以设定一个低阈值lowerThres和一个高阈值upperThres用来指出图像中所需要的对象的连通数(也就是连通分量的像素数目),就可以将连通数在范围之外的对象滤除。
凸壳
如果连接物体A内任意两点的直线段都在A的内部,则称A是凸的,**任意物体A的凸壳H是包含A的最小凸物体。
因为光照不均等其他原因,所以图像在二值化之后,本身形状容易发生破损,也就不那么容易找到质心,所以适当的进行凸壳处理,可以找到包含原始形状的最小凸多边形,便于找到物体质心而后进行像素化处理。
bwmorph()函数
matlab中有一个bwmorph()函数,很多形态学操作都可以利用这个函数进行实现,
Iout=bwmorph(I,operation,n);
参数说明:
- I为输入二值图像;
- operation是一个指定操作类型的字符串,有如下取值,
合法取值 | 功能描述 |
---|---|
‘bridge’ | 桥接由单个像素缝隙分隔的前景像素 |
‘clean’ | 清除孤立的前景像素 |
‘diag’ | 围绕对角线相连的前景像素进行填充 |
‘fill’ | 填充单个像素的孔洞 |
‘hbreak’ | 去掉前景中的H形连结 |
‘majority’ | 如点P的8邻域中一半以上的像素为前景像素,则使P也为前景像素;否则P为背景像素 |
‘remove’ | 去除内部像素(无背景像素相邻的前景像素) |
‘shrink’ | 将物体收缩为一个点或者带洞的环形 |
‘skel’ | 骨骼化图像 |
‘spur’ | 去除毛刺 |
‘thicken’ | 粗化物体 |
‘thin’ | 将物体细化至最低限度相连的线形 |
- 可选参数n是一个正整数,用于指定将被重复操作的次数,默认为1。当设定为n=Inf时表示重复操作一直到图像停止改变为止。
- Iout为经过n次operation参数指定操作后的输出图像。