📄 linjunjuandoc.cpp
字号:
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
IFFT(orgpic,cData);
for (int i=0;i<orgpic.row;i++)
for (int j=0;j<orgpic.col;j++)
{
dealpic.p[i][j]=(int)cData[i][j].real;
}
for (i=0;i<orgpic.row;i++)
delete [] cData[i];
delete [] cData;
cData=NULL;
flagFourier=FALSE;
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
}
else
AfxMessageBox("没有经过付氏变换!");
return;
}
void CLinjunjuanDoc::OnHistogram()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
Histogram dlg;
dlg.gray=HistoGarm (orgpic);
dlg.flagHis=TRUE;
if (dlg.DoModal()==IDOK)
{
}
return;
}
void CLinjunjuanDoc::OnFliterPart()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
KERNEL ke;
PartFliterDialog dlg;
if (dlg.DoModal()==IDOK)
{
ke=dlg.ker;
}
else return;
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
::PartFliter(orgpic,ke,dlg.m_fenmu,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnPrewitt()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
KERNEL kex,key;
kex.kernel[0]=-1;
kex.kernel[1]=0;
kex.kernel[2]=1;
kex.kernel[3]=-1;
kex.kernel[4]=0;
kex.kernel[5]=1;
kex.kernel[6]=-1;
kex.kernel[7]=0;
kex.kernel[8]=1;
key.kernel[0]=1;
key.kernel[1]=1;
key.kernel[2]=1;
key.kernel[3]=0;
key.kernel[4]=0;
key.kernel[5]=0;
key.kernel[6]=-1;
key.kernel[7]=-1;
key.kernel[8]=-1;
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
::Sobel(orgpic,kex,key,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnRoberts()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
::Robert(orgpic,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
return;
}
void CLinjunjuanDoc::OnRadon()
{
int i;
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
//AfxMessageBox("代码还未调试,暂时不能使用!");
//return;
/*
for(i=0;i<orgpic.row;i++)
for(int j=0;j<orgpic.col;j++)
{
orgpic.p[i][j]=orgpic.p[i][j]&193;//(31<<k);
if(orgpic.p[i][j]!=0)
orgpic.p[i][j]=255;
}
*/
/*
for (i=0;i<orgpic.row;i++)
for (int j=0;j<orgpic.col;j++)
{
if (orgpic.p[i][j]!=0&&orgpic.p[i][j]!=255)
{
AfxMessageBox("不是二值图象!");
return ;
}
}*/
/*
for (i=2;i<orgpic.row-2;i++)
for (int j=2;j<orgpic.col-2;j++)
{
if (orgpic.p[i-2][j-2]==0&&orgpic.p[i-1][j-2]==0&&orgpic.p[i][j-2]==0&&orgpic.p[i+1][j-2]==0&&orgpic.p[i+2][j-2]
&&orgpic.p[i-2][j-1]==0&&orgpic.p[i-1][j-1]==0&&orgpic.p[i][j-1]==0&&orgpic.p[i+1][j-1]==0&&orgpic.p[i+2][j-1]
&&orgpic.p[i-2][j-0]==0&&orgpic.p[i-1][j]==0&&orgpic.p[i][j]==0&&orgpic.p[i+1][j]==0&&orgpic.p[i+2][j]
&&orgpic.p[i-2][j+1]==0&&orgpic.p[i-1][j+1]==0&&orgpic.p[i][j+1]==0&&orgpic.p[i+1][j+1]==0&&orgpic.p[i+2][j+1]
&&orgpic.p[i-2][j+2]==0&&orgpic.p[i-1][j+2]==0&&orgpic.p[i][j+2]==0&&orgpic.p[i+1][j+2]==0&&orgpic.p[i+2][j+2])
orgpic.p[i][j]=255;
}*/
RadonDialogBox dlg;
if (dlg.DoModal()==IDOK)
{
step=float(1.0/(float)(dlg.m_step));
threshold=dlg.m_threshold;
Radonpic=NewRadon(orgpic,&dlg.m_step,dealpic.row,dealpic.col);//RRadon(orgpic,&dlg.m_step,dealpic.row,dealpic.col);//Radon(orgpic,&dlg.m_step,dealpic.row,dealpic.col);
cornernum=dealpic.row;
rhoMax=dealpic.col;
if (!(dealpic.p=::fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
// flagRadon=TRUE;
// OnInvradon();
::normalize(Radonpic,&dealpic.row,&dealpic.col,dealpic);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic.p=dealpic.p;
orgpic.col=dealpic.col;
orgpic.row=dealpic.row;
flagRadon=TRUE;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
// OnSobel();//门限
float u0=0,u1=0; //类内均值
float w0=0,w1=0; //类概率
float equ=0,max=0; //类间方差
int sum=orgpic.col*orgpic.row; //总象素个数
int gray[256];
float percent[256];
for(int i=0;i<256;i++)
{
gray[i]=0;percent[i]=0;
}
for(i=0;i<orgpic.row;i++)
for(int j=0;j<orgpic.col;j++)
gray[orgpic.p[i][j]]++;
for(i=0;i<256;i++) //计算各灰度级的比率
percent[i]=(float)gray[i]/(float)sum;
for(i=0;i<256;i++)
{
for(int j=0;j<i;j++)
{
u0+=percent[j]*j;w0+=percent[j];
}
for(j=i;j<256;j++)
{
u1+=percent[j]*j;w1+=percent[j];
}
if(w0!=0&&w1!=0)
equ=w0*w1*(u1/w1-u0/w0)*(u1/w1-u0/w0);
if(equ>max)
{
// threshold=i;
max=equ;
}
u0=u1=w0=w1=0;
}
OnInvradon();
UpdateAllViews(NULL);
return;
}
}
/*
void CLinjunjuanDoc::OnFileOpen()
{
CString ext = "Picture Types (*.bmp)|*.bmp|Picture Type(*.pic)|*.pic|All Files (*.*)|*.*||";
CFileDialog dlg(TRUE, NULL , NULL,OFN_HIDEREADONLY ,ext, NULL);
dlg.m_ofn.lpstrTitle = "请选择相关面数据文件";
if(dlg.DoModal() == IDOK)
{
//CString FileName;
//FileName=dlg.GetPathName;
OnOpenDocument((LPCTSTR)dlg.GetPathName());
}
else return ;
}
*/
void CLinjunjuanDoc::OnFileSaveAs()
{
if (!orgpic.p)
return;
char ext[] = "picture types (*.bmp)|*.bmp|picture types (*.pic)|*.pic|picture types (*.tif)|*.tif|picture types (*.raw)|*.raw||";
CFileDialog dlg(FALSE,"bmp" ,"*.bmp",OFN_OVERWRITEPROMPT|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY ,ext, NULL);
if(dlg.DoModal() == IDOK)
{
::writepic(dlg.GetPathName(),orgpic);
}
else return ;
}
void CLinjunjuanDoc::OnNoise()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
NoiseDialogBox dlg;
if (dlg.DoModal()==IDOK)
{
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
Noise(orgpic,dealpic,dlg.m_num,dlg.m_gray);
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
}
return;
}
void CLinjunjuanDoc::OnLowpass()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
int rank0,rank1;
rank0=(int)(log(orgpic.row)/log(2));
rank1=(int)(log(orgpic.col)/log(2));
if (pow(2,rank0)!=orgpic.row||pow(2,rank1)!=orgpic.col)
{
AfxMessageBox("图象大小不是2的倍数,不适合2FFT!");
return;
}
LowPass dlg;
dlg.flagNo=0;
int radius;
if (dlg.DoModal()==IDOK)
{
radius=dlg.m_radius*orgpic.row/100;
cData=new complex *[orgpic.row];
for (int k=0;k<orgpic.row;k++)
cData[k]=new complex [orgpic.col];
if (!cData)
return;
for (int i=0;i<orgpic.row;i++)
for (int j=0;j<orgpic.col;j++)
{
cData[i][j].real=orgpic.p[i][j];
cData[i][j].imag=0;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
Fourier(orgpic,cData);
flagFourier=TRUE;
int temprow,tempcol;
temprow=orgpic.row/2;
tempcol=orgpic.col/2;
int threshold=(int)((radius*radius)/4);
for(i=0;i<temprow;i++)
for(int j=0;j<tempcol;j++)
if((i*i+j*j)>threshold)
{
cData[i][j].real=cData[i][j].imag = 0; //半径以外的元素取0
cData[i][orgpic.col-1-j].real=cData[i][orgpic.col-1-j].imag=0;
cData[orgpic.row-1-i][j].real=cData[orgpic.row-1-i][j].imag=0;
cData[orgpic.row-1-i][orgpic.col-1-j].real=cData[orgpic.row-1-i][orgpic.col-1-j].imag=0;
}
OnIfft();
}
}
void CLinjunjuanDoc::OnHighpass()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
int rank0,rank1;
rank0=(int)(log(orgpic.row)/log(2));
rank1=(int)(log(orgpic.col)/log(2));
if (pow(2,rank0)!=orgpic.row||pow(2,rank1)!=orgpic.col)
{
AfxMessageBox("图象大小不是2的倍数,不适合2FFT!");
return;
}
LowPass dlg;
dlg.flagNo=1;
int radius;
if (dlg.DoModal()==IDOK)
{
radius=dlg.m_radius*orgpic.row/100;
cData=new complex *[orgpic.row];
for (int k=0;k<orgpic.row;k++)
cData[k]=new complex [orgpic.col];
if (!cData)
return;
for (int i=0;i<orgpic.row;i++)
for (int j=0;j<orgpic.col;j++)
{
cData[i][j].real=orgpic.p[i][j];
cData[i][j].imag=0;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
} Fourier(orgpic,cData);
flagFourier=TRUE;
int temp=radius/2;//加速
int threshold=radius*radius/4;
for(i=0;i<temp;i++)
for(int j=0;j<temp;j++)
if((i*i+j*j)<threshold)
{
cData[i][j].real=cData[i][j].imag = 0; //半径以外的元素取0
cData[i][orgpic.col-1-j].real=cData[i][orgpic.col-1-j].imag=0;
cData[orgpic.row-1-i][j].real=cData[orgpic.row-1-i][j].imag=0;
cData[orgpic.row-1-i][orgpic.col-1-j].real=cData[orgpic.row-1-i][orgpic.col-1-j].imag=0;
}
OnIfft();
}
}
void CLinjunjuanDoc::OnInvradon()
{
if (!flagRadon)
{
AfxMessageBox("没有进行RADON变换!");
return;
}
dealpic.row=oldpic.row;
dealpic.col=oldpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
reconstruct(Radonpic,&cornernum,&rhoMax,&step,&dealpic.row,&dealpic.col,dealpic.p,&threshold);
for (int i=0;i<cornernum;i++)
{
delete [] Radonpic[i];
}
delete []Radonpic;
Radonpic=NULL;
flagRadon=FALSE;
/*
unsigned char **temp;
temp=fspace_2d(dealpic.row,dealpic.col);
if (temp==NULL)
return;
for (int j=0;j<dealpic.col;j++)
for (int i=0;i<dealpic.row;i++)
{
temp[i][j]=dealpic.p[i][j];
}
for (j=0;j<dealpic.col;j++)
for (int i=0;i<dealpic.row;i++)
{
dealpic.p[i][dealpic.col-j-1]=temp[i][j];
}
dspace_2d(temp,dealpic.row,dealpic.col);
*/
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic.p=dealpic.p;
orgpic.col=dealpic.col;
orgpic.row=dealpic.row;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
}
void CLinjunjuanDoc::OnBigger()
{
rate=(float)(rate*1.1);
flagsmall_big=TRUE;
UpdateAllViews(NULL);
}
void CLinjunjuanDoc::OnSmaller()
{
rate=(float)(rate*0.9);
flagsmall_big=TRUE;
UpdateAllViews(NULL);
}
void CLinjunjuanDoc::OnViewReal()
{
rate=1.0;
flagsmall_big=TRUE;
UpdateAllViews(NULL);
}
void CLinjunjuanDoc::OnThresholdTwo()
{
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=::fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
TwoThreshold dlg;
dlg.gray=HistoGarm (orgpic);
dlg.flagHis=TRUE;
//显示要处理图形
dlg.input=orgpic;
dlg.output=dealpic;
dlg.flagpic=TRUE;
if (dlg.DoModal()==IDOK)
{
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dlg.output;
if ((m_hDIB=ChangeToHDIB(orgpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -