1.一种书法单字的笔画自动提取方法,其特征在于,具体按照以下步骤进行;
步骤1:对书法单字图片进行灰度化及二值化处理,根据二值化后的图片中黑色像素点四邻域像素点的信息获取单字的轮廓;
步骤2,对步骤1中得到的轮廓进行角点检测,并选取约束边集合和约束点集合,进行约束Delaunay三角剖分;
步骤3,计算任意两个包含两个以上所述步骤2中的角点的连接三角形的最小距离,确定交叉区域及交叉区域所连接的笔画段;
步骤4,对所述步骤3中的所有交叉区域所连接的笔画段进行连续性分析,对符合条件的笔画段进行连接,得到单个笔画轮廓,并进行轮廓填充,最后完成笔画的提取;
步骤1中所述灰度化处理具体为设图片中任意一个像素点的RGB值分别为r、g、b,则该像素点灰度值gray的计算公式为:gray=0.11×r+0.59×g+0.11×b;
所述二值化处理具体为图像总的像素数目为n,统计像素值为i的像素点数目,i为1‑
254之间的整数,并除以n,得到归一化值,记为ni;从0开始选取整数作为阈值t,根据统计像素值在区间[0,t)内的像素所占比例w0,根据 计算该区间内像素的平均灰度值u0;根据 统计像素值在区间[t,255]内的像素所占比例w1,根据 计算该区间内像素的平均灰度值u1,根据gt=w0×w1×(u0‑2
u1) 计算阈值为t的情况下这两个区间像素平均灰度值得方差gt,将使得gt最大的阈值t作为最佳阈值,将该值作为阈值对图像进行二值化处理,处理后的图像为白底黑字的图像,白色背景像素值为255,黑色前景对应像素值为0;
所述获取单字的轮廓具体为遍历二值图像中的所有黑色像素点,若其四邻域内的像素点的像素值均为0,则该点为非轮廓点,将该点的像素值赋值为255,否则,该点为轮廓点,最终得到轮廓图,根据 估算笔画宽度stroke_width,其中,Nb,Nc分别为二值图和轮廓图中黑色像素点的数目;
轮廓单像素化处理及分叉点去除:遍历所述轮廓图中的黑色像素点,若满足下述条件之一,则将该像素点的像素值赋值为255;
该像素点的8邻域内只有一个黑色像素点;
该像素点的去除后8邻域内黑色像素点仍然连通;
利用OpenCV库中的连通域分析函数判断其连通域数目n,若n>1,则不连通;
重复进行上述步骤,直到图像不再变化为止,最终得到单像素宽度的轮廓图;
对所述单像素轮廓图进行轮廓追踪:具体为对每个黑色像素点设置一个追踪记录,初始值为0,表示未被追踪,从第一个未被追踪的黑色像素点开始追踪,将其追踪记录改为1,将追踪到的像素点的索引值加入到集合Ci中,最终得到闭合轮廓点的集合Ci={(xk,yk)|k=1,2...n},重复该步骤,直到所有黑色像素点的追踪记录均为1为止,最总得到若干个闭合轮廓点的集合;
所述轮廓角点检测:遍历轮廓点集合中的所有点,第i个点表示为vi,坐标表示为(vi_x,vi_y),根据下式计算其尖锐度sharp(vi):其中,vi‑k、vi+k表示和vi距离为 的两个点,
表示两点间的欧式距离,若该点的尖锐度满足sharp
对第i个约束点集合Ci_point,对应的约束边集合为Ci_edge={(m,(m+1)%numi)|m=
1,2...numi},其中numi表示第i个约束点集合Ci_point中点的个数;
内外轮廓的判断:对于每一个闭合轮廓,判断其轮廓内的点的数目num1及其轮廓内的黑色像素点的数目num2,若num2/num1>0.1,则该轮廓为外轮廓,否则该轮廓为内轮廓;并记录内轮廓内部第一个点的坐标,加入内点集合I_point={(xi,yi)|i=1,2,...numI}中;
Delaunay三角剖分:根据得到的约束点集合、约束边集合、内点集合,利用Triangle三角剖分库,进行约束Delaunay三角剖分,该步骤会得到一个三角形集合T={(l,m,n)|l,m,n∈[0,nump‑1]},一个边集合Edge={(l,m)|l,m∈[0,nump‑1]},nump表示约束点集中点的个数,三点确定一个三角形,两点确定一条边,其中,包含一条约束边的三角形称为普通三角形,包含约束边的三角形称为连接三角形;
所述内外轮廓的判断方法为:
若某点的索引为(x,y),点集{(x',y)|x'=0,1,...,x‑1}中轮廓点的数目为n1,点集{(x',y)|x'=x+1,x+2,...,h‑1}中轮廓点的数目为n2,点集{(x,y')|y'=0,1,...,y‑1}中轮廓点的数目为n3,中轮廓点的数目为n4,{(x,y')|y'=x+1,x+2,...,w‑1}其中h,w分别为图像的高和宽,若n1,n2,n3,n4中有一个数为0或四个数均为偶数,则该点不在轮廓内,否则,该点在轮廓内;
所述步骤3中,建立三角形邻接表:对三角形集合中的第i个三角形,寻找与其相邻的三角形,若第i个三角形与第l,m,n个三角形有共同边,则邻接表集合中的第i个元素为(l,m,n),最终得到邻接表集合Table={(a,b,c)|a,b,c∈[0,numT‑1]},numT表示三角形集合中三角形的个数;
寻找交叉区域:对于三角形集合中的任意两个包含两个及以上角点的连接三角形t1,t2,设两三角形三边所对应的中点分别为M1,M2,M3和M1',M2',M3',规定两三角形的距离dis(t1,t2)=min{|MiMj'||i,j∈[1,3]},其中|MiMj'|表示两点间的欧式距离;
若满足: 则t1,t2属于同一个交叉区域,加入交
叉区域集合c_area={(a,b...)|a,b∈[0,numT‑1]},称Mi,Mj'所在的两个边被合并,对所有的包含两个及以上角点的连接三角形对进行以上判断,并记录未被合并的边;
交叉区域所连接的子笔画段的定义为:与交叉区域集合中的三角形相邻,且包含未被合并的边的length个普通三角形,记作(a1,a2,...,alength),其中带下标的a表示三角形的序号,从交叉区域的三角形开始遍历三角形邻接表,得到某一个交叉区域对应的子笔画段集合为:{(a1,a2,...,alength),(b1,b2,...,blength),....};
所述步骤4中,估算子笔画段的宽度和斜率:子笔画段(a1,a2,...,alength)的非约束边表示为(a_e1,a_e2,...,a_elength+1),边a_ei的中点坐标为(a_xi,a_yi),一个普通三角形的三边长度分别为l1,l2,l3,其中l3为约束边的长度,根据wi=2×Si/l3计算序号为i的三角形的宽度wi,其中p=(l1+l2+l3)/2,根据 估算
子笔画段(a1,a2,...,alength)的笔画宽度wa,根据下式估算子笔画段(a1,a2,...,alength)的斜率Ka:交叉区域子笔画段的组合:对于交叉区域连接的任意两个子笔画段(a1,a2,...,alength),(b1,b2,...,blength),根据 计算两子笔画段中点连线的斜率,根据下式计算两子笔画段的连续性f(a,b):
其中,Aa=arctan(Ka),Aa,Aa,b同理,计算交叉区域连接的任意两个子笔画段的连续性,将满足f
单个笔画轮廓提取:从第一个三角形开始,遍历邻接表,并将遍历到的三角形序号加入集合单个笔画集合STi={t1,t2,...}中,i表示第i次遍历,重复该步骤,直到所有的三角形序号都存在于某一集合时为止;对于单个笔画集合中的所有三角形进行处理,假设该三角形所包含的约束边的两个顶点为(x1,y1),(x2,y2),若这两个顶点属于上述某一轮廓点集合中,则将该轮廓集合中这两个元素之间的所有元素加入单个笔画轮廓点集合:SCi={(xi,yi)|i=1,2,...}中,重复该步骤,得到所有的单个笔画集合STi对应的单个笔画轮廓点集合SCi;
轮廓填充,完成笔画提取:新建n张和原图相同大小的空白图片I1,I2,...,In,n为单个笔画轮廓点集合的数目,将Ii中SCi集合所对应的像素点赋值为0,最终得到单个笔画的轮廓图,对每个轮廓图进行轮廓填充,得到最终的单个笔画提取结果;
所述步骤4中,所述增删操作1的具体步骤为:对joint集合中的元素(a1,b1),在邻接表集合的第a1个元素中添加b1,在邻接表集合的第b1个元素中添加a1,对joint集合中所有元素均进行该操作;
增删操作2的具体步骤为:对break集合中的元素e1,邻接表第e1个元素中属于某一交叉区域的值为d,在邻接表集合的第e1个元素中删除d,在邻接表集合的第d个元素中删除e1,对break集合中所有元素均进行该操作;
轮廓填充的具体步骤为:
若原二值图中某一黑色像素点的坐标为(x,y),判断某点是否在轮廓内部,若该点在第i个轮廓图Ii内部,则将Ii中坐标为(x,y)的点赋值为0,重复该步骤,直到填充完所有轮廓。