📄 imagecodesdoc.cpp
字号:
convoflag=TRUE;
}
void CImageCodesDoc::OnProcessMaxl()//局部最大类间方差
{
// TODO: Add your command handler code here
label=false;
if(Grayflag==false) Gray();
unsigned int i,j,ri,cj,temp[50][50],T;
::SetCursor(mHWait);
for(ri=0;ri<r0-50;ri+=50)//模块大小为50×50
{
for(cj=0;cj<c0-50;cj+=50)
{
for(i=ri;i<ri+50;i++)
for(j=cj;j<cj+50;j++)
temp[i-ri][j-cj]=GrayValue[i][j];
T=MaxClass(temp);//用最大类间方差求取50×50个像素的阈值
for(i=ri;i<ri+50;i++)
for(j=cj;j<cj+50;j++)
if(GrayValue[i][j]>T)
convo[i][j]=255;
else
convo[i][j]=0;
}
if(cj<c0)//如果列不是50的整数倍,就用当前T对剩余列进行划分
for(i=ri;i<ri+50;i++)
for(j=cj;j<c0;j++)
if(GrayValue[i][j]>T)
convo[i][j]=255;
else
convo[i][j]=0;
}
if(ri<r0)//如果行不是50的整数倍,就用当前T对剩余行进行划分
for(i=ri;i<r0;i++)
for(j=0;j<c0;j++)
if(GrayValue[i][j]>T)
convo[i][j]=255;
else
convo[i][j]=0;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
convoflag=TRUE;
::SetCursor(mHArrow);
}
void CImageCodesDoc::OnUpdateProcessMaxl(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::ProcessMaxl1() //对当前图用最大类间方差求取阈值,并进行分割
{
if(convoflag==false) CopyGrayValueToConvo();
erflag=TRUE;
unsigned int i,j,n[256],GrayColor,t,T,temp,N;
double p[256],w1,w2,u1,u2,d1,d2,dt,dw,at;
double Db,MaxDb;
for(i=0;i<256;i++)
n[i]=0;
t=T=0;
Db=MaxDb=dt=dw=at=0.0;
temp=0;
for(i=1;i<r0-1;i++)
for(j=1;j<c0-1;j++)
{
temp=convo[i][j];
n[temp]++;
}
//统计n[i]
for(i=0;i<256;i++)
N=N+n[i];
//统计N
for(i=0;i<256;i++)
p[i]=(double)(n[i])/(double)(N);
//统计p[i]
for(t=0;t<256;t++)
{
w1=0.0;
for(i=0;i<=t;i++)
w1=w1+p[i];
w2=0.0;
for(i=t+1;i<256;i++)
w2=w2+p[i];
u1=0.0;
for(i=0;i<=t;i++)
u1=u1+i*p[i];
u2=0.0;
for(i=t+1;i<256;i++)
u2=u2+i*p[i];
if(w1==0) w1=0.00001;//防止除零
if(w2==0) w2=0.00001;//防止除零
u1=u1/w1;
u2=u2/w2;
d1=0.0;
for(i=0;i<=t;i++)
d1=d1+(i-u1)*(i-u1)*p[i];
d2=0.0;
for(i=t+1;i<256;i++)
d2=d2+(i-u2)*(i-u2)*p[i];
d1/=w1;
d2/=w2;
dw=w1*d1*d1+w2*d2*d2;
Db=w1*w2*(u1-u2)*(u1-u2);
dt=Db+dw;
at=Db/dt;
//计算类间方差Db
if(at>MaxDb)
{
MaxDb=at;
T=t;
}
}
//求出阈值T
convoflag=TRUE;
for(i=1;i<r0-1;i++)
for(j=1;j<c0-1;j++)
{
if(convo[i][j]<T)
GrayColor=0;
else
GrayColor=255;
GrayValue[i][j]=GrayColor;
}
CopyGVToConvo();
Grayflag=false;
}
void CImageCodesDoc::OnProcessMaxl1()
{
// TODO: Add your command handler code here
label=TRUE;
ProcessMaxl1();//对当前图进行阈值分割
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
::SetCursor(mHArrow);
}
void CImageCodesDoc::OnUpdateProcessMaxl1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnXingH() //对原始图用水平算子进行腐蚀
{
// TODO: Add your command handler code here
label=false;
unsigned int r,c;
ProcessMaxl();//先用最大类间方差算法对原图二值化
for(r=0;r<r0;r++)
for(c=1;c<c0-1;c++)
{
GrayValue[r][c]=0;//先把当前点赋成黑色
if(convo[r][c-1]==255||convo[r][c]==255||convo[r][c+1]==255)
GrayValue[r][c]=255;//模板下只要有一个点为白色,就把当前点置成白色
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnXingV() //对原始图用垂直算子进行腐蚀
{
// TODO: Add your command handler code here
label=false;
unsigned int r,c;
ProcessMaxl();
for(r=1;r<r0-1;r++)
for(c=0;c<c0;c++)
{
GrayValue[r][c]=0;
if(convo[r-1][c]==255||convo[r][c]==255||convo[r+1][c]==255)
GrayValue[r][c]=255;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnXingFang()//对原始图用方形算子进行腐蚀
{
// TODO: Add your command handler code here
label=false;
unsigned int r,c,i,j;
BOOL breakflag=false;
ProcessMaxl();
for(r=0;r<r0-2;r++)
for(c=0;c<c0-2;c++)
{
GrayValue[r+1][c+1]=0;
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
if(convo[r+i][c+j]==255)
{GrayValue[r+1][c+1]=255;breakflag=TRUE;break;}
if(breakflag==TRUE) break;
}
breakflag=false;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnUpdateXingFang(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdateXingH(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdateXingV(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnXingH1()//对当前图进行水平腐蚀
{
// TODO: Add your command handler code here
label=TRUE;
unsigned int r,c;
xingflag=TRUE;
if(erflag==false)
ProcessMaxl1();
for(r=0;r<r0;r++)
for(c=1;c<c0-1;c++)
{
GrayValue[r][c]=0;
if(convo[r][c-1]==255||convo[r][c]==255||convo[r][c+1]==255)
GrayValue[r][c]=255;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnXingFang1() //对当前图进行方形腐蚀
{
// TODO: Add your command handler code here
label=TRUE;
BOOL breakflag=false;
unsigned int r,c,i,j;
xingflag=TRUE;
if(erflag==false)
ProcessMaxl1();
for(r=0;r<r0-2;r++)
for(c=0;c<c0-2;c++)
{
GrayValue[r+1][c+1]=0;
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
if(convo[r+i][c+j]==255)
{GrayValue[r+1][c+1]=255;breakflag=TRUE;break;}
if(breakflag==TRUE) break;
}
breakflag=false;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnXingV1() //对当前图进行垂直腐蚀
{
// TODO: Add your command handler code here
label=TRUE;
unsigned int r,c;
xingflag=TRUE;
if(erflag==false)
ProcessMaxl1();
for(r=1;r<r0-1;r++)
for(c=0;c<c0;c++)
{
GrayValue[r][c]=0;
if(convo[r-1][c]==255||convo[r][c]==255||convo[r+1][c]==255)
GrayValue[r][c]=255;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnUpdateXingFang1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdateXingH1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdateXingV1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnPengH()//对原始图进行水平膨胀
{
// TODO: Add your command handler code here
label=false;
unsigned int r,c;
ProcessMaxl();
for(r=0;r<r0;r++)
for(c=1;c<c0-1;c++)
{
GrayValue[r][c]=255;//先把当前点置成白色
if(convo[r][c-1]==0||convo[r][c]==0||convo[r][c+1]==0)
GrayValue[r][c]=0;//模板下有一个点为黑色就把当前点置成黑色
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnPengH1() //对当前图进行水平膨胀
{
// TODO: Add your command handler code here
label=TRUE;
unsigned int r,c;
xingflag=TRUE;
if(erflag==false)
ProcessMaxl1();
for(r=0;r<r0;r++)
for(c=1;c<c0-1;c++)
{
GrayValue[r][c]=255;
if(convo[r][c-1]==0||convo[r][c]==0||convo[r][c+1]==0)
GrayValue[r][c]=0;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnPengFang()//对原始图进行方形膨胀
{
// TODO: Add your command handler code here
label=false;
unsigned int r,c,i,j;
BOOL breakflag=false;
ProcessMaxl();
for(r=0;r<r0-2;r++)
for(c=0;c<c0-2;c++)
{
GrayValue[r+1][c+1]=255;
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
if(convo[r+i][c+j]==0)
{GrayValue[r+1][c+1]=0;breakflag=TRUE;break;}
if(breakflag==TRUE) break;
}
breakflag=false;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnPengFang1()//对当前图进行方形膨胀
{
// TODO: Add your command handler code here
label=TRUE;
BOOL breakflag=false;
unsigned int r,c,i,j;
xingflag=TRUE;
if(erflag==false)
ProcessMaxl1();
for(r=0;r<r0-2;r++)
for(c=0;c<c0-2;c++)
{
GrayValue[r+1][c+1]=255;
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
if(convo[r+i][c+j]==0)
{GrayValue[r+1][c+1]=0;breakflag=TRUE;break;}
if(breakflag==TRUE) break;
}
breakflag=false;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnPengV() //对原始图进行垂直膨胀
{
// TODO: Add your command handler code here
label=false;
unsigned int r,c;
ProcessMaxl();
for(r=1;r<r0-1;r++)
for(c=0;c<c0;c++)
{
GrayValue[r][c]=255;
if(convo[r-1][c]==0||convo[r][c]==0||convo[r+1][c]==0)
GrayValue[r][c]=0;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnPengV1()//对当前图进行垂直膨胀
{
// TODO: Add your command handler code here
label=TRUE;
unsigned int r,c;
xingflag=TRUE;
if(erflag==false)
ProcessMaxl1();
for(r=1;r<r0-1;r++)
for(c=0;c<c0;c++)
{
GrayValue[r][c]=255;
if(convo[r-1][c]==0||convo[r][c]==0||convo[r+1][c]==0)
GrayValue[r][c]=0;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
}
void CImageCodesDoc::OnUpdatePengV1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePengV(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePengFang1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePengH(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePengFang(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePengH1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -