2.1.2 滤波
由于原图像各部分亮度不均,背景图像有不同的情况,得到的二值图会有很多噪声,条码区域有,条码区域外也有,为了后续部分的条码提取和条码译码,需要进行滤波处理。考虑到一维条码的特征:竖直的条和空,采用中值滤波方法,中值滤波模板如图3所示。被圈部分表示模板遍历整幅图时,所对应待检像素的位置。取待滤波像素上下相邻的4个像素值,共5个像素值进行排序,用中间值覆盖待滤波的像素值。此模块能有效地滤除条码区的椒盐噪声,背景区的噪声能得到很大抑制。此模块是根据一维码的特征设计,可以适合各种一维码。
2.1.3 边缘检测
常用的边缘检测算法有梯度算法、Roberts梯度法、Sobel算法和Laplaceian算法等,在充分研究一维条码的特征后,借鉴各种检测算法,在此自行设计了一种滤波算法。由于设计实验时采用的是640×480或320×240的图像,假设条码占整个图像的50 %以上,根据图2可以算出每个模块占的像素值为3到4个或l到2个,如果采用3×3或5×5之类的边缘检测模板,加上图像原本的变形,将会误检边缘或边缘丢失,同时考虑到一维条码的特征:竖直的条和空,有明显的竖直边缘,因此设计了竖直边缘检测算法,边缘检测模板如图4所示。
待检像素的值由其邻域内10个像素的值决定,这10个值按模板中的权值相加的绝对值为s(x,y)。由于进行边缘检测的图像是二值图,非黑(0)即白(255),设定边缘检测的阈值T1=255×4=1 020,即邻域内至少有4处黑白突变才能说明待检像素为一边缘值,按照下式得到边缘检测图像h(x,y)。
2.2 图像提取
图像提取是把图像中的条码部分割出来,用于后续的条码译码。图像提取的步骤分为:上下分割和左右分割。根据条码的特征,分别设计了上下分割和左右分割的算法。
2.2.1 上下分割
基于前文的假设,设计了如下分割算法,上下分割的流程如图5(a)所示,此流程的设计应用了条码的两个特征:条空数为59个,即边缘数为60个;条码的上下部分都有空白区。当然一般情况下,条码区域所在行肯定还会存在噪声,因此边缘数是肯定大于60的,而在条码上下的空白区所在行经过图像预处理基本没多少噪声,边缘数基本不会大于60,通过对100幅图像的试验只有背景很复杂的2幅图例外。但是没分割出来不代表没译码出来,后面译码部分对分割有补充修正。根据各种图像的不同,上下分割不会把整个条码区域分割出来,但分割出来的图像信息足以用来解码。上下分割可以去除图像中上下部分的非条码区同时为译码减少了计算量。