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