admin 管理员组文章数量: 1087139
2024年3月20日发(作者:喵视频下载教程)
以下示范调用MATLAB的细化函数
I = imread('');
I2 = bwmorph(I, 'thin',Inf);
figure,imshow(I)
figure,imshow(I2)
可以看出,MATLAB的细化效果是很好的,相比之下,网上找的一些代码的效果就差很多
了。MATLAB很强大!
我通过设置断点,进入MATLAB底层,看看BWMORPH这个函数是怎么样的,把程序实
际运行了的代码抠出来,得到以下结果:
%
function[cout,lut]=bwmorph(a,op,n);
fcn=deblank(functionString(idx,:));%%调试可看到匹配结果fun='thin'
c = a;
iter = 1;
done = n == 0;
while (~done)%%%循环去掉多与像素直至没有可去掉的像素
lastc = c;
[c,lut]=feval_r(fcn,c);%%%进入内部会跳到下面的thin函数,fcn='thin',
done = ((iter >= n) | isequal(lastc, c));
iter = iter + 1;
end
function[c,lut]=thin(a)%%%每执行一次thin函数,图像就分别利用lut1和lut2两个模板去
掉外层像素点,
lut=[];
if(isempty(a))
c=zeros(size(a));
return;
end
lut1=lutthin1;
image_iter1=applylut(a,lut1);
lut1=lutthin2;
c=applylut(image_iter1,lut2);
end
function lut = lutthin1
lut = [
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;0;1;1;0;0;1;1;0;0;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;0;0;1;1;0;0;1;1;0;0;1;1;0;0;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;0;0;0;1;1;0;0;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;0;0;1;1;0;0;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;0;0;0;1;0;0;1;1;0;0;1;1;0;0;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
0;1;0;0;0;1;0;0;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;];
function lut = lutthin2
lut = [
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;0;0;1;0;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
0;1;1;1;0;1;1;1;0;0;1;1;0;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;0;0;1;0;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
0;1;1;1;0;1;1;1;0;0;1;1;0;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
1;1;1;1;1;1;1;1;0;0;1;0;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
0;1;1;1;0;1;1;1;0;0;1;1;0;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
0;1;1;1;1;1;1;1;0;0;1;0;1;1;1;1;
0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
0;1;1;1;0;1;1;1;0;0;1;1;0;1;1;1;];
现在关键就是applylutc这个函数没有抠出来了!
在目录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)每次使用模板时,先算出所有要削去的像素,然后再执行削的动作。而不是找到一个
削一个。好处是执行结果和扫描图像的顺序无关,结果可预知。
版权声明:本文标题:示范调用MATLAB的细化函数 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1710911148a579207.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论