OCR处理主要包括图像分割,目标标记,目标识别三步。今天主要详细介绍一种基于连通区域的的目标标记方法,将给出算法步骤,并举例进行说明。
算法步骤
假设当前图像矩阵为F, 标记矩阵为L,(i,j)为图像中任意一点的坐标,LabelNum为当前标记数。
一 创建标记矩阵
对图像按行遍历,当出现目标点,即F(i,j−1)=0,F(i,j)=1F(i,j-1)=0, F(i,j)=1F(i,j−1)=0,F(i,j)=1时:
则以(i,j)(i, j)(i,j)为起点,继续向右遍历,当满足以下条件时结束遍历:
1)出现背景点:F(i,k)=1,F(i,k+1)=0F(i,k)=1, F(i,k+1)=0F(i,k)=1,F(i,k+1)=0 ;
2)行尾:F(i,k)=1,k+1=ImageWidthF(i,k)=1, k+1=ImageWidthF(i,k)=1,k+1=ImageWidth;
对于当前第iii行得到的连通区域{
(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(LabelNum++LabelNum++LabelNum++),对 {
(i,y)∣y∈(j,k)}\{(i,y)| y \in (j, k)\}{
(i,y)∣y∈(j,k)}进行标记,并记录第i行与上一行连通区域的标记数,记为[LabelNum,LabelNum][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)}进行标记,并记录所有连通区域的的标记数,比如:[LabelNum,LabelNum],[LabelNum,LabelNum2],[LabelNum,LabelNum3][LabelNum, LabelNum], [LabelNum, LabelNum2], [LabelNum, LabelNum3][LabelNum,LabelNum],[LabelNum,LabelNum2],[LabelNum,LabelNum3];
二 创建标记数映射表
对所有标记数记录进行遍历,假设对于任意一个标记数记录[LabelNumcur,LabelNumlast][LabelNum_{cur}, LabelNum_{last}][LabelNumcur,LabelNumlast]:
1)如果LabelNumcur=LabelNumlastLabelNum_{cur} = LabelNum_{last}LabelNumcur=LabelNumlast,则Map[LabelNumcur]=LabelNumcurMap[LabelNum_{cur}] = LabelNum_{cur}Map[LabelNumcur]=LabelNumcur;
2)如果LabelNumcur≠LabelNumlastLabelNum_{cur} \neq LabelNum_{last}LabelNumcur̸=LabelNumlast,则Map[LabelNumcur]=LabelNumlastMap[LabelNum_{cur}] = LabelNum_{last}Map[LabelNumcur]=LabelNumlast,或者Map[LabelNumlast]=LabelNumcurMap[LabelNum_{last}] = LabelNum_{cur}