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)每次使用模板时,先算出所有要削去的像素,然后再执行削的动作。而不是找到一个削一个。好处是执行结果和扫描图像的顺序无关,结果可预知。
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)每次使用模板时,先算出所有要削去的像素,然后再执行削的动作。而不是找到一个削一个。好处是执行结果和扫描图像的顺序无关,结果可预知。
相关文章推荐
- 【MATLAB】图像细化算法
- 基于经典分割算法的图像内细胞识别与计数(matlab实现)(不定期更新完善)
- matlab暗通道图像去雾算法实现
- 数字图像去噪典型算法及matlab实现
- 数字图像去噪典型算法及matlab实现
- 基于Retinex的图像去雾算法(MATLAB实现)
- 模式识别经典算法——FCM图像聚类分割(最简matlab实现)
- 数字图像去噪典型算法及matlab实现 推荐
- 数字图像去噪典型算法及matlab实现
- 数字图像去噪典型算法及matlab实现
- 数字图像去噪典型算法及matlab实现
- 图像细化matlab代码实现
- 数字图像去噪典型算法及matlab实现
- 模式识别经典算法——Kmeans图像聚类分割(以最短的matlab程序实现)
- 一种图像的曝光增强算法 MATLAB 实现
- 图像算法之十二:非局部均值滤波及其Matlab实现
- MATLAB图像处理与计算机视觉(3):实现Carsten Steger 的曲线检测算法(1)
- Vlad 寻找相似图像,算法matlab实现
- 图像去模糊算法在CUDA上的实现,基于MATLAB平台
- MATLAB GUI实现常见图像处理算法与视频跟踪算法