OCR处理主要包括图像分割,目标标记,目标识别三步。今天主要详细介绍一种基于连通区域的的目标标记方法,将给出算法步骤,并举例进行说明。
算法步骤
假设当前图像矩阵为F, 标记矩阵为L,(i,j)为图像中任意一点的坐标,LabelNum为当前标记数。
一 创建标记矩阵
对图像按行遍历,当出现目标点,即 F ( i , j − 1 ) = 0 , F ( i , j ) = 1 F(i,j-1)=0, F(i,j)=1 F(i,j−1)=0,F(i,j)=1时:
则以 ( i , j ) (i, j) (i,j)为起点,继续向右遍历,当满足以下条件时结束遍历:
1)出现背景点: F ( i , k ) = 1 , F ( i , k + 1 ) = 0 F(i,k)=1, F(i,k+1)=0 F(i,k)=1,F(i,k+1)=0 ;
2)行尾: F ( i , k ) = 1 , k + 1 = I m a g e W i d t h F(i,k)=1, k+1=ImageWidth F(i,k)=1,k+1=ImageWidth;
对于当前第 i i i行得到的连通区域 { ( i , y ) ∣ y ∈ ( j , k ) } \{(i,y)| y \in (j, k)\} {
(i,y)∣y∈(j,k)},其所对应的上一行的连通区域为 { ( i − 1 , y ) ∣ y ∈ ( j − 1 , k + 1 ) } \{(i-1,y)| y \in (j-1, k+1)\} {
(i−1,y)∣y∈(j−1,k+1)},对 { ( i − 1 , y ) ∣ y ∈ ( j − 1 , k + 1 ) } \{(i-1,y)| y \in (j-1, k+1)\} {
(i−1,y)∣y∈(j−1,k+1)}进行遍历:
1)如果当前行为图像的第一行:$i=0 $ ;
2)如果当前行为目标的起始行: F ( i − 1 , y ) = 0 , y ∈ ( j − 1 , k + 1 ) F(i-1, y)=0, y \in(j-1, k+1) F(i−1,y)=0,y∈(j−1,k+1)
则将当前标记数加1( L a b e l N u m + + LabelNum++ LabelNum++),对 { ( i , y ) ∣ y ∈ ( j , k ) } \{(i,y)| y \in (j, k)\} {
(i,y)∣y∈(j,k)}进行标记,并记录第i行与上一行连通区域的标记数,记为 [ L a b e l N u m , L a b e l N u m ] [LabelNum, LabelNum] [LabelNum,LabelNum];
3)如果第i行为目标的中间行,则找到 { ( i − 1 , y ) ∣ y ∈ ( j − 1 , k + 1 ) } \{(i-1,y)| y \in (j-1, k+1)\} {
(i−1,y)∣y∈(j−1,k+1)}内的所有连通区域,以第一个连通区域的标记数对 { ( i , y ) ∣ y ∈ ( j , k ) } \{(i,y)| y \in (j, k)\} {
(i,y)∣y∈(j,k)}进行标记,并记录所有连通区域的的标记数,比如: [ L a b e l N u m , L a b e l N u m ] , [ L a b e l N u m , L a b e l N u m 2 ] , [ L a b e l N u m , L a b e l N u m 3 ] [LabelNum, LabelNum], [LabelNum, LabelNum2], [LabelNum, LabelNum3] [LabelNum,LabelNum],[LabelNum,LabelNum2],[LabelNum,LabelNum3];
二 创建标记数映射表
对所有标记数记录进行遍历,假设对于任意一个标记数记录 [ L a b e l N u m c u r , L a b e l N u m l a s t ] [LabelNum_{cur}, LabelNum_{last}] [LabelNumcur,LabelNumlast]:
1)如果 L a b e l N u m c u r = L a b e l N u m l a s t LabelNum_{cur} = LabelNum_{last} LabelNumcur=LabelNumlast,则 M a p [ L a b e l N u m c u r ] = L a b e l N u m c u r Map[LabelNum_{cur}] = LabelNum_{cur} Map[LabelNumcur]=LabelNumcur;
2)如果 L a b e l N u m c u r ≠ L a b e l N u m l a s t LabelNum_{cur} \neq LabelNum_{last} LabelNumcur̸=LabelNumlast,则 M a p [ L a b e l N u m c u r ] = L a b e l N u m l a s t Map[LabelNum_{cur}] = LabelNum_{last} Map[LabelNumcur]=LabelNumlast,或者 M a p [ L a b e l N u m l a s t ] = L a b e l N u m c u r Map[LabelNum_{last}] = LabelNum_{cur} Map[LabelNumlast