您的位置:首页 > 编程语言 > MATLAB

Matlab的图像细化算法(详细实现)

2009-12-18 21:20 1046 查看
在目录matlab/toolbox/images/images/private下可以找到源代码。
lutskel1.m,lutskel2.m,lutskel3.m,lutskel4.m,lutskel5.m,lutskel6.m,lutskel7.m,lutskel8.m,八个模板文件。applylutc.c,函数applylutc的实现,函数入口为mexFunction,执行图像细化算法时,会执行函数Compute3by3LogicalResult。执行edit bwmorph就可以看到主函数bwmorph的源代码。
Matlab使用3×3的模板,模板包含9个像素,每个像素只能取0或1,因此模板有2的9次方(512)种不同的形式。Matlab给每个模板一个编号0~511,编号等于模板中像素的加权和,各像素的权重如下表。
1 8 64
2 16 128
4 32 256
模板文件lutskel*.m是一个长度为512的数值,第1个元素对应编号为0的模板,第512个元素对应编号为511的模板。第i个元素值为1,表示可以去掉对应模板的中间的像素,将其像素值从1改为0。

void Compute3by3LogicalResult(mxArray *BWout, 输出图像
mxArray *BWin, 输入图像
mxArray *lut) { 输入的模板
int numRows, numCols;
int r, c;
mxLogical *pBWin;
double *plut;
mxLogical *pBWout;

pBWin = mxGetLogicals(BWin);
plut = (double *) mxGetData(lut);
pBWout = mxGetLogicals(BWout);

numRows = mxGetM(BWin); 图像总行数
numCols = mxGetN(BWin); 图像总列数

for (c = 0; c < numCols; c++) {
for (r = 0; r < numRows; r++) {
MATRIX_REF(pBWout, numRows, r, c) = (mxLogical)
*(plut + Nhood3Offset(pBWin, numRows, numCols, r, c));
}
}
}

模板文件1,去掉下面多余的像素
89 91 217 219
+++ +++ +++ +++
-+- ++- -++ +++
--- --- --- ---

模板文件2,去掉左下多余的像素
152 153 216 217 408 409 472 473
-+- ++- -++ +++ -+- ++- -++ +++
-++ -++ -++ -++ -++ -++ -++ -++
--- --- --- --- --+ --+ --+ --+

将模板文件1、2中的模板旋转一下得到其他6个模板文件。
模板文件3,去掉右面多余的像素
模板文件4,去掉右下多余的像素
模板文件5,去掉左面多余的像素
模板文件6,去掉右上多余的像素
模板文件7,去掉上面多余的像素
模板文件8,去掉左上多余的像素
八个模板文件中有好几个模板是重复的,去掉一些不影响结果。
Matlab中图像细化算法的特点:
(1)将模板分成八个方向,轮着使用各个方向的模板,削去一层像素。不像有些算法拿着一个方向的模板使劲地削,不能再削后才换一个模板。
(2)每次使用模板时,先算出所有要削去的像素,然后再执行削的动作。而不是找到一个削一个。好处是执行结果和扫描图像的顺序无关,结果可预知。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: