📄 segmentationbyprojection.cpp
字号:
nStart = -1;
nEnd = -1;
}
}
}
else
{
ptList.AddTail(CPoint(nStart,i));
nStart = -1;
nEnd = -1;
}
}
else
{
if (nStart>=0)
{
ptList.AddTail(CPoint(nStart,i));
nStart = -1;
nEnd = -1;
}
}
}
}
i++;
}
int nCount = ptList.GetCount();
if (nCount<6)
{
continue;
}
else if (nCount>=6) //正常
{
break;
}
}
int nWNum[MAXWIDTH];
memset(nWNum,0,sizeof(int)*MAXWIDTH);
pos = ptList.GetHeadPosition();
while (pos)
{
ptTemp = ptList.GetNext(pos);
if (ptTemp.y-ptTemp.x<MAXWIDTH&&ptTemp.y-ptTemp.x>3)
{
nWNum[ptTemp.y-ptTemp.x]++;
}
}
int nMaxNum = nWNum[0];
int nMaxNo = 0;
for(i=0;i<MAXWIDTH;i++)
{
if (nMaxNum<nWNum[i])
{
nMaxNum = nWNum[i];
nMaxNo = i;
}
}
//字宽应该是nMaxNo
if (nMaxNo<3)
{
delete []nX;
return FALSE;
}
//排除第3个黑点
if (ptList.GetCount()>7)
{
for(i=1;i<4;i++)
{
pos = ptList.FindIndex(i);
ptTemp = ptList.GetAt(pos);
if (ptTemp.y-ptTemp.x<nMaxNo-1)
{
BOOL bHave = TRUE;
for(int j=ptTemp.x;j<=ptTemp.y;j++)
{
if (nX[j]>nHeight*0.8)
{
bHave = FALSE;
break;
}
}
if (bHave)
{
ptList.RemoveAt(pos);
break;
}
}
}
}
nCount = ptList.GetCount();
int nMinNum,nMinNo;
POSITION posLast;
//先看有合并的没有
pos = ptList.GetHeadPosition();
POSITION posNext;
int nNo = 0;
CPoint ptTemp1;
while (pos)
{
ptTemp = ptList.GetNext(pos);
if (ptTemp.y-ptTemp.x<=nMaxNo/2)
{
if (pos)
{
posNext = pos;
ptTemp1 = ptList.GetNext(posNext);
if (ptTemp1.y-ptTemp1.x<=nMaxNo/2&&ptTemp1.y-ptTemp.x<nMaxNo+2)//应该合并
{
ptList.GetPrev(pos);
ptList.SetAt(pos,CPoint(ptTemp.x,ptTemp1.y));
posNext = pos;
ptList.GetNext(posNext);
ptList.RemoveAt(posNext);
}
}
}
}
//再看有没有可以分解的
pos = ptList.GetHeadPosition();
nIndex = 0;
posLast = pos;
while (pos)
{
ptTemp = ptList.GetNext(pos);
if (ptTemp.y-ptTemp.x>nMaxNo+2&&nIndex>1) //需要拆分
{
nMinNo = ptTemp.x+1;
nMinNum = nX[ptTemp.x+1];
for(i=ptTemp.x+1;i<ptTemp.y-1;i++)
{
if (nMinNum>nX[i])
{
nMinNum = nX[i];
nMinNo = i;
}
}
if (nMinNum<3&&(nMinNo-ptTemp.x>3)&&(ptTemp.y-nMinNo>3))
{
ptList.InsertBefore(posLast,CPoint(ptTemp.x,nMinNo));
ptList.SetAt(posLast,CPoint(nMinNo,ptTemp.y));
}
}
nIndex++;
posLast = pos;
}
pos = ptList.GetHeadPosition();
posLast = pos;
nIndex = 0;
while (pos)
{
ptTemp = ptList.GetNext(pos);
if (ptTemp.y-ptTemp.x>nMaxNo+1) //有噪音
{
nMinNum = nX[ptTemp.x];
nMinNo = ptTemp.x;
for(i=ptTemp.x+1;i<ptTemp.y-1;i++)
{
if (nMinNum>nX[i])
{
nMinNum = nX[i];
nMinNo = i;
}
}
if (nMinNum<3&&(nIndex<=3||nIndex==ptList.GetCount()-1))
{
if (nMinNo-ptTemp.x<3&&ptTemp.y-nMinNo>nMaxNo-3)
{
ptList.SetAt(posLast,CPoint(nMinNo,ptTemp.y));
}
else if (nMinNo-ptTemp.x>nMaxNo-3&&ptTemp.y-nMinNo<=3)
{
ptList.SetAt(posLast,CPoint(ptTemp.x,nMinNo));
}
}
}
posLast = pos;
nIndex++;
}
//去掉最后一竖
nCount = ptList.GetCount();
if (nCount>7)
{
ptTemp = ptList.GetTail();
if (ptTemp.y-ptTemp.x<3)
{
double dCenter[4];
for(i=nCount-1;i>nCount-5;i--)
{
pos = ptList.FindIndex(i);
ptTemp = ptList.GetAt(pos);
dCenter[nCount-1-i] = (ptTemp.y+ptTemp.x)/2;
}
for(i=0;i<3;i++)
{
dCenter[i] = dCenter[i]-dCenter[i+1];
}
if (dCenter[0]<(dCenter[1]+dCenter[2])/2-2)
{
ptList.RemoveTail();
}
}
}
//去上下边框
pos = ptList.GetHeadPosition();
int nTop[20];
int nButtom[20];
nIndex = 0;
CImage imgTemp;
while (pos)
{
ptTemp = ptList.GetNext(pos);
ImgOut.CutFromImg(imgTemp,CRect(ptTemp.x,0,ptTemp.y+1,ImgOut.GetHeight()));
ImgList.AddTail(imgTemp);
imgTemp.CutUpAndDown(nTop[nIndex],nButtom[nIndex]);
nIndex++;
}
int nTopOut[20];
int nButtomOut[20];
ImgIn.GetOutUpAndDown(nTop, nButtom, nIndex, nTopOut, nButtomOut,ImgOut.GetHeight());
pos = ptList.GetHeadPosition();
posLast = pos;
ImgList.RemoveAll();
nIndex = 0;
int nH = (int)(ImgOut.GetHeight()*0.5);
nH = max(nH,7);
while (pos)
{
//底下是为了取出灰度图象
/*
ptTemp = ptList.GetNext(pos);
ImgGray.CutFromImg(imgTemp,CRect(ptTemp.x,0,ptTemp.y+1,ImgOut.GetHeight()));
CImage ImgOut1;
ImgOut1 = imgTemp;
ImgOut1.imGraytoTwo(imgTemp,m_bBlack);
CList<CRect,CRect> ListRect;
imgTemp.imLTquzao(ListRect);
ImgList.AddTail(imgTemp);
posLast = pos;
nIndex++;*/
ptTemp = ptList.GetNext(pos);
ImgOut.CutFromImg(imgTemp,CRect(ptTemp.x,0,ptTemp.y+1,ImgOut.GetHeight()));
//下面为只保留最大连通区域...可考虑修改去掉点少的和连通域在右边的,而且第一个汉字不用执行。
imgTemp.DenoiseMax();
imgTemp.CutOffUnUsedArea();
ImgList.AddTail(imgTemp);
posLast = pos;
nIndex++;
}
delete []nX;
//去前面几个黑块
int nRemove = 0;
if (ImgList.GetCount()>7)
{
int nIndex = 0;
for(i=2;i>0;i--)
{
pos = ImgList.FindIndex(i);
imgTemp = ImgList.GetAt(pos);
double dPix = imgTemp.GetAllTextPointNum(CRect(0,0,imgTemp.GetWidth(),imgTemp.GetHeight()),0);
dPix /= imgTemp.GetWidth()*imgTemp.GetHeight();
if (dPix>0.65)
{
nIndex = i;
break;
}
}
for(i=nIndex-1;i>=0;i--)
{
pos = ImgList.FindIndex(i);
ImgList.RemoveAt(pos);
pos = ptList.FindIndex(i);
ptList.RemoveAt(pos);
}
if (nIndex>0)
{
while (ImgList.GetCount()>7)
{
ImgList.RemoveTail();
}
while (ptList.GetCount()>7)
{
ptList.RemoveTail();
}
}
}
if (ptList.GetCount()>7)
{
//先根据第2和第三个字之间有一个点来确定去掉什么地方
//算出两个字之间的距离最大的两个
pos = ptList.FindIndex(4);
CPoint ptLast = ptList.GetAt(pos);
nMaxNum = 0;
nMaxNo = 4;
for(i=3;i>0;i--)
{
pos = ptList.FindIndex(i);
ptTemp = ptList.GetAt(pos);
if (ptLast.y-ptTemp.x>nMaxNum)
{
nMaxNum = ptLast.y - ptTemp.x;
nMaxNo = i;
}
ptLast = ptTemp;
//如果是1
if (ptTemp.y-ptTemp.x<=nMaxNo/2)
{
ptLast.y = ptLast.x + nMaxNo;
}
}
nMaxNo+=2;
//要是nMaxNo>0,说明在第nMaxNo前有一个点
nIndex = ImgList.GetCount();
if (nMaxNo>1&&nIndex>7)
{
for(i=0;i<nMaxNo-3;i++)
{
if (ImgList.GetCount()<=7) {
break;
}
ImgList.RemoveHead();
ptList.RemoveHead();
nRemove++;
}
for(i=0;i<nIndex-nMaxNo-4;i++)
{
if (ImgList.GetCount()<=7)
{
break;
}
ImgList.RemoveTail();
ptList.RemoveTail();
}
}
}
CImage ImgOut2;
ImgOut2 = ImgGray;
pos = ptList.GetHeadPosition();
CPoint ptFirst = ptList.GetAt(pos);
pos = ptList.GetTailPosition();
CPoint ptLast = ptList.GetAt(pos);
int kkk;
int ll;
if(ImgList.GetCount()>=7 && (ptFirst.y-ptFirst.x)>=5)
{
kkk = max(ptFirst.x-2,0);
ll = min(ptLast.y+2,ImgGray.GetWidth());
RImgGray.CutFromImg(ImgOut2,CRect(kkk,0,ll,RImgGray.GetHeight()));
}
else
{
kkk = max(ptFirst.x+nLR[0]-12,0);
ll = min(ptLast.y+nLR[0],ImgGray.GetWidth());
ImgGray.CutFromImg(ImgOut2,CRect(kkk,0,ll,ImgGray.GetHeight()));
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -