📄 rsipview.cpp
字号:
float *lpenerg=(float *)malloc(Size*Size*sizeof(float));
float Max = -MAXFLOAT;
float Min = MAXFLOAT;
int Process=0;
int RPro;
DWORD Order;
for(i=0; i<Size; i++)
{
RPro=(int)(100.0 * (i+1) / Size);
if(RPro>Process)
{
for(int j=0; j<RPro-Process; j++)
UpdateStatusBar();
Process=RPro;
}
for (int j=0; j<Size; j++)
{
Order = i*Size+j;
lpenerg[Order]=lpreal[Order]*lpreal[Order]+
lpimag[Order]*lpimag[Order];
lpenerg[Order]=(float)log(sqrt(lpenerg[Order])+1);
if(lpenerg[(DWORD)i*Size+j]>Max)
Max=lpenerg[(DWORD)i*Size+j];
if(lpenerg[(DWORD)i*Size+j]<Min)
Min=lpenerg[(DWORD)i*Size+j];
}
}
free(lpimag);
free(lpreal);
BYTE *pNewData = (BYTE *)malloc(Size*Size);
// 对频域信息作线性拉伸5倍(即为255*5)
float Ratio = 1275/(Max-Min);
for ( i=0; i<Size; i++)
for (int j=0;j<Size; j++)
{
Temp=(lpenerg[(DWORD)i*Size+j]-Min)*Ratio;
if(Temp<0)
pNewData[(DWORD)i*Size+j]=0;
else if(Temp>255)
pNewData[(DWORD)i*Size+j]=255;
else
pNewData[(DWORD)i*Size+j]=(BYTE)Temp;
}
free(lpenerg);
EndWaitCursor();
CRSImage * pNewRSImage = new CRSImage();
pNewRSImage->m_pImgData = pNewData;
pNewRSImage->m_nImgHeight = Size;
pNewRSImage->m_nImgWidth = Size;
pNewRSImage->m_nImgType = IMAGE_SINGLEBAND;
CRSIPApp *theApp = (CRSIPApp *)AfxGetApp();
theApp->CreateNewImageDoc(pNewRSImage,"功率谱(频域信息)");
}
}
void CRSIPView::OnImageRevert()
{
CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
pDoc->m_pRSImage->Revert();
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = TRUE;
}
}
void CRSIPView::OnImageEquualize()
{
CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
pDoc->m_pRSImage->Equalize();
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = TRUE;
}
}
void CRSIPView::OnImageThreshold()
{
CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
CThresholdDlg thresholdDlg(this);
if(pDoc->m_pRSImage->m_pdwHistogram==NULL ||
pDoc->m_bHistogramModified == TRUE)
{
pDoc->m_pRSImage->CalHistogram();
pDoc->m_bHistogramModified = FALSE;
}
thresholdDlg.m_pdwHistogram = pDoc->m_pRSImage->m_pdwHistogram;
if(thresholdDlg.DoModal() == IDOK)
{
pDoc->m_pRSImage->Threshold(thresholdDlg.m_nThresholdLevel);
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = TRUE;
}
}
}
void CRSIPView::OnImagePosterize()
{
CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
CPosterizeDlg posterizeDlg(this);
if(pDoc->m_pRSImage->m_pdwHistogram==NULL ||
pDoc->m_bHistogramModified == TRUE)
{
pDoc->m_pRSImage->CalHistogram();
pDoc->m_bHistogramModified = FALSE;
}
posterizeDlg.m_pdwHistogram = pDoc->m_pRSImage->m_pdwHistogram;
if(posterizeDlg.DoModal() == IDOK)
{
int nNum = posterizeDlg.m_nNum;
BYTE temp[256];
for(int i=0; i<nNum+1; i++)
{
temp[i] = posterizeDlg.m_lpPoint[i];
}
pDoc->m_pRSImage->Posterize(temp,nNum);
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = TRUE;
}
}
}
void CRSIPView::OnFilterFilter()
{
CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
CFilterDlg filterDlg(this);
if(filterDlg.DoModal() == IDOK)
{
int filterType = filterDlg.m_nFilterType;
int filterWndSize = (filterDlg.m_nFilterWndSize+1)*2+1;
pDoc->m_pRSImage->Filter(filterWndSize,filterType);
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = TRUE;
}
}
}
void CRSIPView::OnFilterPower()
{
CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
if(pDoc->m_pRSImage->m_nImgType != IMAGE_SINGLEBAND)
{
AfxMessageBox("该功能只适于单波段图象!");
return;
}
int Size=pDoc->m_pRSImage->m_nImgWidth>pDoc->m_pRSImage->m_nImgHeight?
pDoc->m_pRSImage->m_nImgWidth:pDoc->m_pRSImage->m_nImgHeight;
if(Size>1024)
{
MessageBox("做二维傅立叶变换,图象过大!");
return;
}
int Time=powerof2(2,Size);
//int Time=int(log(Size)/log(2))+1;
Size=1;
for(int i=0;i<Time;i++)
Size*=2;
BYTE *pbMap = (BYTE *)malloc(Size*Size);
if(pbMap == NULL)
{
MessageBox("做二维傅立叶变换,内存不足!");
return;
}
int BmpCol = (pDoc->m_pRSImage->m_nImgWidth+3)/4*4;
for(i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
pbMap[(DWORD)i*Size+j] =
pDoc->m_pRSImage->m_pImgData[(DWORD)(pDoc->m_pRSImage->m_nImgHeight-i-1)*BmpCol+j];
float *lpreal = NULL;
float *lpimag = NULL;
lpreal = (float *)malloc(sizeof(float)*Size*Size);
lpimag = (float *)malloc(sizeof(float)*Size*Size);
if(lpimag==NULL || lpreal==NULL)
{
if(lpimag!=NULL)
free(lpimag);
if(lpreal!=NULL)
free(lpreal);
free(pbMap);
MessageBox("做二维傅立叶变换,内存不足!");
return;
}
BeginWaitCursor();
float Temp;
for ( i=0; i<Size; i++)
for (int j=0;j<Size; j++)
{
Temp= (float)pbMap[(DWORD)i*Size+j];
if ( (i+j) %2 != 0 )
lpreal[(DWORD)i*Size+j] = -Temp;
else
lpreal[(DWORD)i*Size+j] = Temp;
lpimag[(DWORD)i*Size+j] = 0.0;
}
free(pbMap);
FFT2D( lpreal, lpimag, Size, 0 ,Time);
EndWaitCursor();
CFrequencyFilterDlg FrequencyFilterDialog(this);
FrequencyFilterDialog.m_nSize = Size;
if(FrequencyFilterDialog.DoModal() == IDOK)
{
int FilterType = FrequencyFilterDialog.m_nFilterType;
int FilterFunc = FrequencyFilterDialog.m_nFilterFunction;
int Radias1 = FrequencyFilterDialog.m_nRadias1;
int Radias2 = FrequencyFilterDialog.m_nRadias2;
BeginWaitCursor();
float Center = (float)(Size-1)/2;
int Process=0;
int RPro;
DWORD Order;
for(i=0; i<Size; i++)
{
RPro=(int)(100.0 * (i+1) / Size);
if(RPro>Process)
{
for(int j=0; j<RPro-Process; j++)
UpdateStatusBar();
Process=RPro;
}
for(int j=0; j<Size; j++)
{
Order = (DWORD)i*Size+j;
if(FilterFunc == 0)//Rect
{
if(FilterType == 0)//High Pass
{
if(fabs(i-Center)<Radias1 && fabs(j-Center)<Radias1)
{
lpimag[Order] = 0.0;
lpreal[Order] = 0.0;
}
}
else if(FilterType == 1)//Low Pass
{
if(fabs(i-Center)>=Radias1 || fabs(j-Center)>=Radias1)
{
lpimag[Order] = 0.0;
lpreal[Order] = 0.0;
}
}
else if(FilterType == 2)//Band
{
if(fabs(i-Center)>=Radias2 || fabs(j-Center)>=Radias2 ||
fabs(i-Center)<Radias1 || fabs(j-Center)<Radias1)
{
lpimag[Order] = 0.0;
lpreal[Order] = 0.0;
}
}
}
else if(FilterFunc == 1)//Circle
{
float Dis = (float)sqrt((i-Center)*(i-Center)+(j-Center)*(j-Center));
if(FilterType == 0)
{
if(Dis < Radias1)
{
lpimag[Order] = 0.0;
lpreal[Order] = 0.0;
}
}
else if(FilterType == 1)
{
if(Dis >= Radias1)
{
lpimag[Order] = 0.0;
lpreal[Order] = 0.0;
}
}
else if(FilterType == 2)
{
if(Dis>=Radias2 || Dis<Radias1)
{
lpimag[Order] = 0.0;
lpreal[Order] = 0.0;
}
}
}
else if(FilterFunc==2) //Butterworth
{
float Dis = (float)sqrt((i-Center)*(i-Center)+(j-Center)*(j-Center));
float Ratio;
if(FilterType==0)
Ratio = float(1/(1+0.414*((float)Radias1*Radias1/Dis/Dis)));
else
Ratio = float(1/(1+0.414*(Dis*Dis/Radias1/Radias1)));
lpimag[Order] *= Ratio;
lpreal[Order] *= Ratio;
}
else //Exponential
{
float Dis = (float)sqrt((i-Center)*(i-Center)+(j-Center)*(j-Center));
float Ratio;
if(FilterType==0)
Ratio = (float)exp(-0.347*(Radias1*Radias1/Dis/Dis));
else
Ratio = (float)exp(-0.347*(Dis*Dis/Radias1/Radias1));
lpimag[Order] *= Ratio;
lpreal[Order] *= Ratio;
}
}
} //Filter end
//Now begin do the inversed FFT,the third parameeter "1" mean inversed FFT
FFT2D( lpreal, lpimag, Size, 1 ,Time);
free(lpimag);
//Now create new document
for (i=0; i<Size; i++)
for (int j=0; j<Size; j++)
{
Temp= (float)lpreal[(DWORD)i*Size+j];
if ( (i+j) %2 != 0 )
lpreal[(DWORD)i*Size+j] = -Temp;
else
lpreal[(DWORD)i*Size+j] = Temp;
}
BYTE *pNewData = (BYTE *)malloc(BmpCol * pDoc->m_pRSImage->m_nImgHeight);
for(i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
{
if(lpreal[i*Size+j]>255)
pNewData[(pDoc->m_pRSImage->m_nImgHeight-i-1)*BmpCol+j]=255;
if(lpreal[(DWORD)i*Size+j]<0)
pNewData[(pDoc->m_pRSImage->m_nImgHeight-i-1)*BmpCol+j]=0;
else
pNewData[(pDoc->m_pRSImage->m_nImgHeight-i-1)*BmpCol+j]=(BYTE)lpreal[(DWORD)i*Size+j];
}
free(lpreal);
EndWaitCursor();
CRSImage *pNewRSImage = new CRSImage();
//pNewRsMap->CopyInfoFrom(pDoc->m_pRsMap);
pNewRSImage->m_pImgData = pNewData;
pNewRSImage->m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
pNewRSImage->m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;
pNewRSImage->m_nImgType = pDoc->m_pRSImage->m_nImgType;
CRSIPApp *theApp = (CRSIPApp *)AfxGetApp();
theApp->CreateNewImageDoc(pNewRSImage,"滤波影象");
}
}
}
void CRSIPView::OnFilterEdege()
{
CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
pDoc->m_pRSImage->FindEdge();
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = TRUE;
}
}
void CRSIPView::OnFilterSharpen()
{
CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
pDoc->m_pRSImage->Sharpen();
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = TRUE;
}
}
void CRSIPView::OnFilterAuto()
{
CRSIPDoc * pDoc = (CRSIPDoc *)GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
CUserDefFilterDlg UserDefFilterDlg(this);
if(UserDefFilterDlg.DoModal() == IDOK)
{
pDoc->m_pRSImage->UserFilter(
UserDefFilterDlg.m_nUnitValue,
UserDefFilterDlg.m_nFactor,
UserDefFilterDlg.m_nBias,
UserDefFilterDlg.m_bRevert);
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = TRUE;
}
}
}
void CRSIPView::OnClassCharacter()
{
CSelfClusterDlg characterWinClsDlg(this);
characterWinClsDlg.m_static = "窗口等级(%)";
characterWinClsDlg.m_nClusterTime = 20;
if(characterWinClsDlg.DoModal()==IDOK)
{
int Height = characterWinClsDlg.m_nImgHeight;
int Width = characterWinClsDlg.m_nImgWidth;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -