📄 image.cpp
字号:
if(bBlackText)
{
ratio = ratio-0.05;
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
}
else
{
ratio = ratio+0.05;
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
}*/
if(bBlackText)
{
if (dRate1<dRate)
{
ratio = ratio-0.05;
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate1 = dRate;
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
Enter = 1;
}
else
{
if (Enter == 1)
{
ratio = ratio+0.1;
}
else
{
ratio = ratio+0.05;
}
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate1 = dRate;
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
}
}
else
{
if (dRate1<dRate)
{
ratio = ratio+0.05;
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate1 = dRate;
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
Enter = 1;
}
else
{
if(Enter == 1)
{
ratio = ratio-0.1;
}
else
{
ratio = ratio - 0.05;
}
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate1 = dRate;
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
}
}
}
while(dRate>0.7 && (ratio<0.4 && ratio>0.1))
{
/*
if(bBlackText)
{
ratio = ratio+0.05;
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
}
else
{
ratio = ratio-0.05;
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
}*/
if(bBlackText)
{
if (dRate1<dRate)
{
ratio = ratio+0.05;
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate1 = dRate;
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
Enter = 1;
}
else
{
if (Enter == 1)
{
ratio = ratio-0.1;
}
else
{
ratio = ratio-0.05;
}
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate1 = dRate;
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
}
}
else
{
if (dRate1<dRate)
{
ratio = ratio-0.05;
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate1 = dRate;
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
Enter = 1;
}
else
{
if(Enter == 1)
{
ratio = ratio+0.1;
}
else
{
ratio = ratio + 0.05;
}
Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
dRate1 = dRate;
dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
dRate/=((GetWidth()/2)*(GetHeight()/2));
}
}
}
/*
if (dRate<0.25)
{
if (bBlackText == TRUE)
{
dPercent = 0.7;
}
else
{
dPercent = 0.3;
}
CRect rcImgTemp(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4);
CutFromImg(ImgTemp,rcImgTemp);
ImgTemp.CalCulate(pHist,pMean,dS);
nToTalPix = ImgTemp.GetWidth()*ImgTemp.GetHeight();
pos=0;
double nPix = 0;
for(i=255;i>0;i--)
{
nPix += pHist[0][i];
if (nPix/nToTalPix>dPercent)
{
pos=i;
break;
}
}
Threthold(ImgOut,pos,!bBlackText);
}
*/
//反色还是有错误,下面的处理方法不好用
if (dRate>0.72)
{
for (i=0;i<nToTalPix;i++)
{
ImgOut.m_pR[i] = BYTE(255-ImgOut.m_pR[i]);
}
}
//求连通,去噪并切割
CImage ImgOut1,ImgOutLianTong;
ImgOut1 = ImgOut;
CList<int,int> ListNum;
CList<CRect,CRect> ListRect;
ImgOut1.GetLiantong(ListNum,ListRect,ImgOutLianTong,0);
ListRect.RemoveAll();
POSITION posList;
int nIndex = 1;
nPix = ImgOut1.GetWidth()*ImgOut1.GetHeight();
while (nIndex<ListNum.GetCount())
{
posList = ListNum.FindIndex(nIndex);
int nVal = ListNum.GetAt(posList);
if (nVal<10 &&nVal>0)
{
for(i=0;i<nPix;i++)
{
if (ImgOutLianTong.m_pR[i]==nIndex)
{
ImgOut1.m_pR[i] = 255;
}
}
}
else if (nVal>=10)
{
CRect rcR(ImgOut1.GetWidth(),ImgOut1.GetHeight(),0,0);
for (i=0;i<ImgOut1.GetHeight();i++)
{
for (int j=0;j<ImgOut1.GetWidth();j++)
{
if (ImgOutLianTong.m_pR[i*ImgOut1.GetWidth()+j]==nIndex)
{
rcR.left = min(j,rcR.left);
rcR.right = max(j,rcR.right);
rcR.top = min(i,rcR.top);
rcR.bottom = max(i,rcR.bottom);
}
}
}
if ((rcR.top<4 || rcR.top>ImgOut1.GetHeight()-4) && rcR.Height()<ImgOut1.GetHeight()/3)
{
for(i=0;i<nPix;i++)
{
if (ImgOutLianTong.m_pR[i]==nIndex)
{
ImgOut1.m_pR[i] = 255;
}
}
}
else if(rcR.Width()<m_nWidth/7&&rcR.Height()>7)
{
ListRect.AddTail(rcR);
}
}
nIndex++;
}
//采用模板分割
//
CList<CImage,CImage&> ListImg;
return ImgOut1.CutTextByModel(ImgOutList);
//////////////////////////////////////////////////////////////////////////
/*int nCount = ListRect.GetCount();
CList<CPoint,CPoint> ptListUp;
CList<CPoint,CPoint> ptListDown;
BOOL bHaveLiangTong = FALSE;
if (nCount>1)//说明能够提取出两个字以上
{
CRect * pRect = new CRect[ListRect.GetCount()];
double dAvgH = 0;
for(i=0;i<nCount;i++)
{
posList = ListRect.FindIndex(i);
pRect[i] = ListRect.GetAt(posList);
dAvgH += pRect[i].Height();
}
dAvgH /= nCount;
for(i=0;i<nCount;i++)
{
if (fabs(pRect[i].Height()-dAvgH)<1.5)
{
ptListUp.AddTail(CPoint(pRect[i].left+pRect[i].Width()/2,pRect[i].top));
ptListDown.AddTail(CPoint(pRect[i].left+pRect[i].Width()/2,pRect[i].bottom));
}
}
if (ptListUp.GetCount()>1)
{
double dA[2],dB[2];
GetLineAB(ptListUp,dA[0],dB[0]);
GetLineAB(ptListDown,dA[1],dB[1]);
if (fabs(dA[0]-dA[1])>0.05)
{
if (fabs(dA[0])<fabs(dA[1]))
{
dA[1] = dA[0];
dB[1] = dB[0]+dAvgH;
}
else
{
dA[0] = dA[1];
dB[0] = dB[1]-dAvgH;
}
}
//求图像的高度
int nUp = ROUND(dA[0]*0+dB[0]);
int nDown = ROUND(dA[1]*0+dB[1]);
int nHeight = nDown-nUp;
nUp = ROUND(dA[0]*m_nWidth+dB[0]);
nDown = ROUND(dA[1]*m_nWidth+dB[1]);
nHeight = max(nDown-nUp,nHeight);
nHeight++;
nHeight = min(nHeight,m_nHeight);
CImage ImgTemp;
ImgTemp.Create(CSize(m_nWidth,nHeight),FALSE);
int j;
for(i=0;i<m_nWidth;i++)
{
nUp = ROUND(dA[0]*i+dB[0]);
nDown = ROUND(dA[1]*i+dB[1]);
nUp = max(nUp,0);
nDown = min(nDown,m_nHeight-1);
for(j=nUp;j<=nDown;j++)
{
if (j-nUp<nHeight)
{
ImgTemp.m_pR[i+(j-nUp)*m_nWidth] =
ImgOut1.m_pR[j*m_nWidth+i];
}
}
}
ImgOut = ImgTemp;
bHaveLiangTong = TRUE;
}
delete []pRect;
}
if (!bHaveLiangTong)
{
if (!ImgOut1.CutExact(ImgOut)) //细定位,输出为黑字白底
{
return FALSE;
}
}
return ImgOut.GetExactText(ImgOutList); */
}
BOOL CImage::Grad(CImage &ImgOut)
{
if (!ImgOut.Create(CSize(this->GetWidth(),this->GetHeight()),FALSE))
{
return FALSE;
}
int nIndex;
for (int i=0;i<ImgOut.GetHeight();i++)
{
for (int j=1;j<ImgOut.GetWidth()-1;j++)
{
nIndex = i*m_nWidth+j;
ImgOut.m_pR[nIndex] = BYTE(abs(2*m_pR[nIndex]-m_pR[nIndex-1]-m_pR[nIndex+1]));
}
}
return TRUE;
}
BOOL CImage::Grad1(CImage &ImgOut)
{
if (!ImgOut.Create(CSize(this->GetWidth(),this->GetHeight()),FALSE))
{
return FALSE;
}
for (int i=0;i<ImgOut.GetHeight();i++)
{
for (int j=0;j<ImgOut.GetWidth();j++)
{
ImgOut.m_pR[i*m_nWidth+j] = 0;
}
}
//int nIndex;
for (i=0;i<ImgOut.GetHeight();i++)
{
for (int j=1;j<ImgOut.GetWidth()-1;j++)
{
//nIndex = i*ImgOut.GetWidth()+j;
ImgOut.m_pR[i*ImgOut.GetWidth()+j] = BYTE(abs(m_pR[i*ImgOut.GetWidth()+j-1]-m_pR[i*ImgOut.GetWidth()+j+1])+0.5);
}
}
return TRUE;
}
//将灰度图转化为二值化图象
BOOL CImage::graytoTwo(CImage &ImgOut, CImage &Imgavg, CImage &ImagTh)
{
if (!ImgOut.Create(CSize(this->GetWidth(),this->GetHeight()),FALSE))
{
return FALSE;
}
int nPix = m_nWidth*m_nHeight;
double dS = 0;
for(int i=0;i<nPix;i++)
{
dS += m_pR[i];
}
dS /= nPix;
for (i=0;i<ImgOut.GetHeight();i++)
{
for (int j=0;j<ImgOut.GetWidth();j++)
{
if (m_pR[i*m_nWidth+j]>ImagTh.m_pR[i*ImagTh.GetWidth()+j]
&& Imgavg.m_pR[i*Imgavg.GetWidth()+j]>BYTE(2*dS))
// && m_pR[i*m_nWidth+j]>2*Imgavg.m_pR[i*Imgavg.GetWidth()+j])
ImgOut.m_pR[i*ImgOut.GetWidth()+j]=BYTE(255);
else
ImgOut.m_pR[i*ImgOut.GetWidth()+j]=BYTE(0);
}
}
return TRUE;
}
BOOL CImage::Stretch(BYTE nMax, BYTE nMin)
{
BYTE nMaxMin[2] = {0,255};
int nPix = m_nWidth*m_nHeight;
for(int i=0;i<nPix;i++)
{
if (m_pR[i]>nMaxMin[0])
{
nMaxMin[0] = m_pR[i];
}
else if (m_pR[i]<nMaxMin[1])
{
nMaxMin[1] = m_pR[i];
}
if (m_bRGB)
{
if (m_pG[i]>nMaxMin[0])
{
nMaxMin[0] = m_pG[i];
}
else if (m_pG[i]<nMaxMin[1])
{
nMaxMin[1] = m_pG[i];
}
if (m_pB[i]>nMaxMin[0])
{
nMaxMin[0] = m_pB[i];
}
else if (m_pB[i]<nMaxMin[1])
{
nMaxMin[1] = m_pB[i];
}
}
}
if (nMax==nMaxMin[0]&&nMin==nMaxMin[1])
{
return TRUE;
}
double dStep = double(nMax-nMin+1)/(nMaxMin[0]-nMaxMin[1]);
double dTemp;
for(i=0;i<nPix;i++)
{
dTemp = dStep * (m_pR[i]-nMaxMin[1]);
dTemp = dTemp>nMax?nMax:dTemp;
dTemp = dTemp<nMin?nMin:dTemp;
m_pR[i] = (BYTE)dTemp;
if (m_bRGB)
{
dTemp = dStep * (m_pG[i]-nMaxMin[1]);
dTemp = dTemp>nMax?nMax:dTemp;
dTemp = dTemp<nMin?nMin:dTemp;
m_pG[i] = (BYTE)dTemp;
dTemp = dStep * (m_pG[i]-nMaxMin[1]);
dTemp = dTemp>nMax?nMax:dTemp;
dTemp = dTemp<nMin?nMin:dTemp;
m_pG[i] = (BYTE)dTemp;
}
}
return TRUE;
}
CString GetAppPath()
{
CString path;
char filepath[1024];
char lpBuffer[1024];
GetModuleFileName(AfxGetInstanceHandle(),lpBuffer,1024);
int len=strlen(lpBuffer);
for(int i=len;i>0;i--)
{
if(lpBuffer[i]=='\\')
{
break;
}
}
memcpy(filepath,lpBuffer,i+1);
filepath[i+1]=0;
path=filepath;
return path;
}
int CImage::GetConnectivity()
{
CImage Temp;
Temp = *this;
Temp.Crop(CRect(-1,-1,m_nWidth+1,m_nHeight+1));
Temp.Inverse();
int iInverseComponentNum;
iInverseComponentNum=Temp.Label();
return (iInverseComponentNum-1);
}
void CImage::Inverse()
{
int nPix = m_nWidth*m_nHeight;
for(long i=0; i<nPix; i++)
m_pR[i]=(unsigned char)(255-m_pR[i]);
}
int CImage::Label()
{
int m_iPixelNum=m_nWidth*m_nHeight;
int* piData;
piData=new int[m_iPixelNum];
for(long k=0; k<m_iPixelNum; k++)
if(m_pR[k]==0)
piData[k]=0;
else
piData[k]=-1;
int iNum=0;
int i,j;
for(i=0;i<m_nHeight;i++)
for(j=0;j<m_nWidth;j++)
{
if(piData[i*m_nWidth+j]==-1)
{
//原点
if( i==0 && j==0 )
{
iNum++;
piData[i*m_nWidth+j]=iNum;
continue;
}
//上边界
if(i==0)
if(piData[i*m_nWidth+j-1]==0)
{
iNum++;
piData[i*m_nWidth+j]=iNum;
continue;
}
else
{
piData[i*m_nWidth+j]=piData[i*m_nWidth+j-1];
continue;
}
//下边界
if(j==0)
if(piData[(i-1)*m_nWidth+j]==0)
{
iNum++;
piData[i*m_nWidth+j]=iNum;
continue;
}
else
{
piData[i*m_nWidth+j]=piData[(i-1)*m_nWidth+j];
continue;
}
if( (i>0&&piData[(i-1)*m_nWidth+j]==0) && (j>0&&piData[i*m_nWidth+j-1]==0) )
{
iNum++;
piData[i*m_nWidth+j]=iNum;
continue;
}
if( (i>0&&piData[(i-1)*m_nWidth+j]!=0) && (j>0&&piData[i*m_nWidth+j-1]==0) )
{
piData[i*m_nWidth+j]=piData[(i-1)*m_nWidth+j];
continue;
}
if( (i>0&&piData[(i-1)*m_nWidth+j]==0) && (j>0&&piData[i*m_nWidth+j-1]!=0) )
{
piData[i*m_nWidth+j]=piData[i*m_nWidth+j-1];
continue;
}
if(piData[(i-1)*m_nWidth+j]==piData[i*m_nWidth+j-1])
piData[i*m_nWidth+j]=piData[i*m_nWidth+j-1];
else
{
int iDiscard=piData[(i-1)*m_nWidth+j];
int iReplace=piData[i*m_nWidth+j-1];
int ii,jj;
for(ii=0; ii<m_nHeight; ii++)
for(jj=0; jj<m_nWidth; jj++)
if(piData[ii*m_nWidth+jj]==iDiscard)
piData[ii*m_nWidth+jj]=iReplace;
piData[i*m_nWidth+j]=iReplace;
}
}
}
for(k=0; k<m_iPixelNum; k++)
piData[k]=-piData[k];
int index=0;
int iValue;
for(k=0; k<m_iPixelNum; k++)
if(piData[k]<0)
{
iValue=piData[k];
index++;
for(long kk=k; kk<m_iPixelNum; kk++)
if(piData[kk]==iValue)
piData[kk]=index;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -