gap_count = 0; start_pos =1; FOR (i = 1 TO n) {
IF (Pi is black)
{ gap_count = 0;
IF (start_pos == 0) start_pos = i;
IF (i == n) {
IF (VerifySegment(start_pos,i) == true)
{ Accept this segment;
Remove the pixels of this segment;
}
}
}ELSE
{ gap_count +=1;
IF (gap_count == MAX_GAP or i == n)
{ IF(i-gap_count-start_pos > MIN_LEN)
{
IF (VerifySegment(start_pos,i-gap_count) == true)
{ Accept this segment;
Remove the pixels of this segment;
}
}
start_pos = 0;
}
}
}
此算法检测所有的 Plb 到 Pub,不包含比 MAX_GAP 长的线段的差距。然后它调用 VerifySegment(start,end) 验证通过检查的每个线段的线宽。线宽的一条线段被投票通过在每个黑检测到的所有本地线宽度,如果在投票的线宽比MAX_LW的还要大, 那么这部分可能是相交线或者是其他形状的一部分,所以它应该被拒绝。由于这种算法并不依赖单一的限值为决定的目的,它克服了困难短线和干扰之间的平衡。从而,它可以正确区分真实直线与点的随机的对齐方式。
图片2:本地线路宽度检测
考虑到线条图像质量差,我们使用容许缺少像素的方法,来检测本地线路的宽度。对于每一个PI,我们使用PI-1和Pi+1(如果可用),以帮助决定(图2),Vi 是 Pi 和垂直传递到PlbPub 一线的直线路径,这也是由 Bresenham 算法生成。Vi(k) (k=-MAX_LW..MAX_LW)k是从PI 到VI路径点。VI(0)= PI。检测从k = 0时,增加1 K反复直到VJ(T)(J = I-1.. I +1,T= K.. K +1)之间的黑色像素数小于4。然后记录停止作为kmax的k表。其次,它随相同的标准来从0开始来取得kmin,最后,当地的线宽计算为kmax-kmin +1。这种方法可以检测出正确的路线,质量较差的图像宽度以及高质量的图像,将存储三个已验证的参数:线段,起点、 终点和线宽。
2.3线的删除
当已验证的所有线段达成一个峰值,那么这些线段的像素会从图片中删除,以免发生重叠。移动矩形区域内参数所决定的线段的像素是很容易的(长轴是从起点到终点,长度短轴的等于线宽)。对于一条单独的线段来说这是正确的。然而,如果还有其他已验证的线段与这条线段相交,它们的交点也会被删除,以致已验证线段的分离。这个问题也同样存在于以移除特征点为基础的其他线段验证方法上。
相反,基于验证分支趋势的交叉点上,我们可以运用交叉点保存的方法[9]。它简单地删除了局部线宽小于或等于矩形线宽的这部分线段。
对于其他部分,也就是交叉部分,它检测分支线段的趋势使其接近边界,以达到删除和保存的目的。此方法仅删除像素属于经过验证的线段。因此,避免重叠线,全部的已检验线段被保留为好。
3.实验结果
在标准的HT使用vc++的基础上,我们已经实施了我们的方法,,源^自#优尔*文·论~文]网[www.youerw.com也运用PC机和PIII500 CPU和256 M RAM执行了实验。图3部分展示了一个真实图像的识别结果。左图是一个原始的图像,右图展示了已检测线段的宽度。两个位置和线宽都能被正确检验到。,水平虚线被保留的同时,垂直折断的线路也恢复了。
真实图像的识别结果
测试数据包括五个真实图像,分别从大小为A4,A3,A2,A1和A0的工程图纸上扫描。在实验中,R是扫描分辨率,我们把MIN_LW设置为0.01R,把MAX_LW设置为0.1R,MIN_LEN设置为0.15R,MAX设置为0.03R。表1显示了这种方法的性能,在这种方法中,时间是指整个处理线检测的时间,T_LV是花费线验证的时间,LS_Num号码是公认的线段,T / LS是平均每条线段的验证时间,Recog_Rate是识别率。