1、对于小的模板2*2或3*3,可以使用查找表的方法进行处理,一般采用以下两种形式的模板:
4
1
8
2
表1.2*2模板
64
8
1
128
16
2
256
32
4
表2.3*3模板
2、举例如下:
对线段端点的检测,检测模板A为
1
1
1
1
1
1
1
1
1
表3.检测模板
红色底的为中心检测点,端点的判断条件是,sum(A(:))==2,也就是说模板检测区域当中心点为1时,它的8邻域最多有一个为1。下图为要检测的图。
图1.检测的图
(1).根据规则首先生成查找表。
1
2
4
8
16
32
64
128
256
1
1
0
0
0
1
0
0
0
0
17+1=18
2
0
1
0
0
1
0
0
0
0
18+1=19
4
0
0
1
0
1
0
0
0
0
20+1=21
8
0
0
0
1
1
0
0
0
0
24+1=25
16
0
0
0
0
1
0
0
0
0
孤立点
32
0
0
0
0
1
1
0
0
0
48+1=49
64
0
0
0
0
1
0
1
0
0
80+1=81
128
0
0
0
0
1
0
0
1
0
144+1=145
256
0
0
0
0
1
0
0
0
1
172+1=173
表4.值应为1的模板
查找表的长度=29=512。3*3模板共有9个格,每个格有2种状态,根据排列组合,可生成29个3*3的模板。但注意到表2的和为511,只能生成【0,511】范围的值,所以还给表2中的每个元素加1,这样才能生成【1,512】范围的索引。
第一行相当于模板:
0
0
1
0
1
0
0
0
0
表5.表4中第一行相当的模板
当是这种情况的时候,索引值为18(16+1+1),这时应把512个元素的查找表的18位置设为1。
右侧红色数字查找表中应该置为1的索引。
最后生成查找表:
0
1
1
1
0
1
1
1
18
19
…
81
…
115
…
145
…
273
表6.查找表
(2).扫描过程:
【1】.扫描到非端点:
0
1
0
0
0
0
1
0
0
1
0
0
1
1
0
0
0
1
0
0
0
1
0
0
0
表7.扫描到非线段终点
采集模板为
1
0
0
0
1
1
0
1
0
表8.采集到的数据模板
,与表2中3*3的模板相点乘,得到:
1*64
0*8
0*1
0*128
1*16
1*2
0*256
1*32
0*4
表9.采集到数据模板与索引模板相点乘
计算得:1*64+0*8+0*1+0*128+1*16+1*2+0*256+1*32+0*4=114,加1得115,查找表得0,这是非端点。
【2】扫描到端点:
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
1
0
0
0
0
0
0
0
0
0
表10.扫描到线段端点
0*64
0*8
0*1
1*128
1*16
0*2
0*256
0*32
0*4
表11.采集到数据模板与索引模板相点乘
计算得:0*64+0*8+0*1+0*128+1*16+0*2+0*256+0*32+0*4=144,加1得145,查表得1,所以这点就是线段的端点。
(3). Matlab程序:
(1) Demo:
im=imread('endpoint.bmp');
bw=im2bw(im);
g=endpoints(bw);
imshow(g);
(2)
function g = endpoints(f)
persistent lut
if isempty(lut)
lut = makelut(@endpoint_fcn,3);
end
g =applylut(f,lut);
(3)
function is_end_point = endpoint_fcn(nhood)
is_end_point = nhood(2,2) &(sum(nhood(:)) == 2); %nhood(2,2)指的是3*3模板中中心位置的点,其坐
%标为(2,2)。这个逻辑表达式指:3*3的模板nhood
%的中心位置(2,2)位置的值为1,且和等于2.
(4)运行结果:
图2.结果图
转自:http://www.cnblogs.com/funtogether/p/3147144.html