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.结果图