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)每次使用模板时,先算出所有要削去的像素,然后再执行削的动作。而不是找到一个

削一个。好处是执行结果和扫描图像的顺序无关,结果可预知。


本文标签: 模板 像素 去掉 图像 函数