📄 imageprocessingview.cpp
字号:
{
temp=pow(2,i);
if(temp>=width)
{
newWidth=(LONG)temp;
break;
}
}
for(i=0;;i++)
{
temp=pow(2,i);
if(temp>=height)
{
newHeight=(LONG)temp;
break;
}
}
if(newWidth>newHeight)
newHeight=newWidth;
else
newWidth=newHeight;
newLineBytes=(newWidth*8+31)/32*4;
HDIB hDIB=(HDIB)::GlobalAlloc(GHND,newHeight*newLineBytes+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD));
lpNewDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+sizeof(RGBQUAD)*256);
lpNewDIBBits=lpNewDIB+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD);
lpNewbmi=(LPBITMAPINFOHEADER)lpNewDIB;
lpNewbmi->biWidth=newWidth;
lpNewbmi->biHeight=newHeight;
LPSTR lpDst;
for(i=0;i<newHeight;i++)
for(j=0;j<newWidth;j++)
{
lpDst=lpNewDIBBits+newLineBytes*(newHeight-1-i)+j;
if(i<=height-1&&j<=width-1)
*((unsigned char *)lpDst)=*(lpDIBBits+LineBytes*(height-1-i)+j);
else
*((unsigned char *)lpDst)=0;
}
::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
::GlobalFree((HGLOBAL)pDoc->m_hDIB);
pDoc->m_hDIB=hDIB;
::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
pDoc=GetDocument();
unsigned char* lpNewBits;
LPSTR pDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());
lpNewBits=(unsigned char*)pDIB+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
LONG w,h;//图象中只有w=2^wp,h=2^hp的部分可以参加傅立叶变换
int wp,hp;
w=h=1;
wp=hp=0;
while(w*2<=newWidth)
{
w*=2;
wp++;
}
while(h*2<=newHeight)
{
h*=2;
hp++;
}
complex<double> *TD = new complex<double>[w * h];
complex<double> *FD = new complex<double>[w * h];
for(i=0;i<w;i++)
for(j=0;j<h;j++)
{
if((i+j)%2)
TD[j*w+i]=complex<double>(-*(lpNewBits+j*newLineBytes+i),0);
else TD[j*w+i]=complex<double>(*(lpNewBits+j*newLineBytes+i),0);
}
for(j=0;j<h;j++)
FFT(&TD[j*w],&FD[j*w],wp);//yan shuping fangxiang fft
for(i=0;i<w;i++)
for(j=0;j<h;j++)
TD[j*w+i]=FD[i*h+j];//zhuan zhi
for(j=0;j<w;j++)
FFT(&TD[j*h],&FD[j*h],hp);//yan shuping fangxiang fft
//now, w hang, h lie
for(i=0;i<h;i++)
for(j=0;j<w;j++)
FD[j*h+i]/=h;
//zhuanzhi & save////////////////////////////////////////
for(i=0;i<w;i++)
for(j=0;j<h;j++)
TD[j*w+i]=FD[i*h+j];//zhuan zhi
//SAVE
pDoc->m_hDFT=::GlobalAlloc(GHND,sizeof(complex<double>)*w*h);
complex<double>* pDFT=(complex<double>*)::GlobalLock(pDoc->m_hDFT);
memcpy(pDFT,TD,sizeof(complex<double>)*w*h);
::GlobalUnlock(pDoc->m_hDFT);
/////////////////////////////////////////////////////////
double dTemp;
w=h=1;
wp=hp=0;
while(w*2<=newWidth)
{
w*=2;
wp++;
}
while(h*2<=newHeight)
{
h*=2;
hp++;
}
//////////////////////////////////////////////////
memcpy(TD,pDFT,sizeof(complex<double>)*w*h);
::GlobalUnlock(pDoc->m_hDFT);
//////////////////////////////////
//first, change pinyu, display pinpu;
//ButterWorth ButterWorth ButterWorth ButterWorth ButterWorth ButterWorth
CRadius dlg;
if(dlg.DoModal()!=IDOK)
return;
double D0;
double D1;
switch(dlg.m_select)
{
case 0://Gassian Lowpass filter
D0=dlg.m_radius;
for(i=0;i<w;i++)
for(j=0;j<h;j++)
{
D1=(double)((i-newWidth/2.0)*(i-newWidth/2.0)+(j-newHeight/2.0)*(j-newHeight/2.0));
dTemp=-(D1)/(2*D0*D0);
dTemp=exp(dTemp);
TD[j*w+i]*=dTemp;
}
break;
case 1://Butterworth Highpass filter
D0=0.05*height;
for(i=0;i<w;i++)
for(j=0;j<h;j++)
{
D1=(double)((i-newWidth/2.0)*(i-newWidth/2.0)+(j-newHeight/2.0)*(j-newHeight/2.0));
dTemp=(D0*D0*D0*D0)/(pow(D1,2));
dTemp=1.0/(1.0+dTemp);
TD[j*w+i]*=dTemp;
}
break;
case 2://High-frequency emphasis filter
float gain,coefficient;
gain=dlg.m_gain;
coefficient=dlg.m_coefficient;
D0=0.05*newHeight;
for(i=0;i<w;i++)
for(j=0;j<h;j++)
{
D1=(double)((i-newWidth/2.0)*(i-newWidth/2.0)+(j-newHeight/2.0)*(j-newHeight/2.0));
dTemp=(D0*D0*D0*D0)/(pow(D1,2));
dTemp=gain+coefficient/(1.0+dTemp);
TD[j*w+i]*=dTemp;
}
break;
}
//second, IDFT
//////////////////////////////////begin to IDFT
//1. GONG/E
for(i=0;i<w;i++)
for(j=0;j<h;j++)
TD[j*w+i]=complex<double>(TD[j*w+i].real(),-TD[j*w+i].imag());
//2.
for(j=0;j<h;j++)
FFT(&TD[j*w],&FD[j*w],wp);//yan shuping fangxiang fft
for(i=0;i<w;i++)
for(j=0;j<h;j++)
TD[j*w+i]=FD[i*h+j];//zhuan zhi
for(j=0;j<w;j++)
FFT(&TD[j*h],&FD[j*h],hp);//yan shuping fangxiang fft
//now, w hang, h lie
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
TD[i*w+j]=FD[j*h+i];//zhuan zhi
TD[i*w+j]/=h;
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
HDIB hDIBb=(HDIB)::GlobalAlloc(GHND,height*LineBytes+*(LPDWORD)pDIB+256*sizeof(RGBQUAD));
LPSTR pDIB2=(LPSTR)::GlobalLock((HGLOBAL)hDIBb);
memcpy(pDIB2,pDIB,*(LPDWORD)pDIB+sizeof(RGBQUAD)*256);
LPSTR pBits=pDIB2+*(LPDWORD)pDIB+256*sizeof(RGBQUAD);
LPBITMAPINFOHEADER pbmi=(LPBITMAPINFOHEADER)pDIB2;
pbmi->biWidth=width;
pbmi->biHeight=height;
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
dTemp=abs(TD[(h-1-i)*w+j].real());
if(dTemp>255)
dTemp=255;
////////////////////////////////
if(i<height&&j<width)
*(pBits+(height-1-i)*LineBytes+j)=dTemp;
}
delete TD;
delete FD;
////////////////////////////////////
////////////////////////////////////
::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
::GlobalFree((HGLOBAL)pDoc->m_hDIB);
pDoc->m_hDIB=hDIBb;
pDoc->m_sizeDoc=CSize((int)width,(int)height);
SetScrollSizes(MM_TEXT,pDoc->m_sizeDoc);
////////////////////////////////////////
////////////////////////////////////////
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
}
void CImageProcessingView::OnZftjh()
{
// TODO: Add your command handler code here
CImageProcessingDoc* pDoc=GetDocument();
if(pDoc->GetHDIB()!=0)
{
LONG width,height;
LONG m,n,i,j;
unsigned char* pBits;
width=WIDTHBYTES(pDoc->m_sizeDoc.cx*8);
//width=(pDoc->m_sizeDoc.cx*8+31)/32*4;
height=pDoc->m_sizeDoc.cy;
LPSTR pDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());
pBits=(unsigned char*)pDIB+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
//we have width, height, pBits now!
//1. Jisuan zhi fang tu
LONG number[256];
for(i=0;i<256;i++)
number[i]=0;
//统计各灰度值的像素数
for(m=0;m<height;m++)
{
for(n=0;n<width;n++)
number[*(pBits+m*width+n)]++;
}
//1.累积直方图
LONG sum[256];
for(i=0;i<256;i++)
sum[i]=0;
sum[0]=number[0];
for(i=1;i<256;i++)
sum[i]=sum[i-1]+number[i];
//2. Jisuan gai lv
double gailv[256];
double Area=(double)(width*height);
for(i=0;i<256;i++)
gailv[i]=(double)sum[i]/Area;
//3. Ying she biao
int map[256];
for(j=0;j<256;j++)
map[j]=int(gailv[j]*255+0.5);//数字图像需四舍五入
//4. bian li zheng fu tu xiang
for(m=0;m<height;m++)
{
for(n=0;n<width;n++)
*(pBits+m*width+n)=map[*(pBits+m*width+n)];
}
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
}
}
void CImageProcessingView::OnMotionblur()
{
// TODO: Add your command handler code here
LONG width,height,LineBytes;
LONG newWidth,newHeight,newLineBytes;
LPSTR lpDIB,lpDIBBits,lpNewDIB,lpNewDIBBits;
LPBITMAPINFOHEADER lpbmi,lpNewbmi;
CImageProcessingDoc *pDoc=GetDocument();
lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->m_hDIB);
lpDIBBits=lpDIB+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD);
lpbmi=(LPBITMAPINFOHEADER)lpDIB;
width=lpbmi->biWidth;
LineBytes=(width*8+31)/32*4;
height=lpbmi->biHeight;
double temp;
LONG i,j;
for(i=0;;i++)
{
temp=pow(2,i);
if(temp>=width)
{
newWidth=(LONG)temp;
break;
}
}
for(i=0;;i++)
{
temp=pow(2,i);
if(temp>=height)
{
newHeight=(LONG)temp;
break;
}
}
if(newWidth>newHeight)
newHeight=newWidth;
else
newWidth=newHeight;
newLineBytes=(newWidth*8+31)/32*4;
HDIB hDIB=(HDIB)::GlobalAlloc(GHND,newHeight*newLineBytes+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD));
lpNewDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+sizeof(RGBQUAD)*256);
lpNewDIBBits=lpNewDIB+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD);
lpNewbmi=(LPBITMAPINFOHEADER)lpNewDIB;
lpNewbmi->biWidth=newWidth;
lpNewbmi->biHeight=newHeight;
LPSTR lpDst;
for(i=0;i<newHeight;i++)
for(j=0;j<newWidth;j++)
{
lpDst=lpNewDIBBits+newLineBytes*(newHeight-1-i)+j;
if(i<=height-1&&j<=width-1)
*((unsigned char *)lpDst)=*(lpDIBBits+LineBytes*(height-1-i)+j);
////////////////////////////////////////////////////////////////////////////////////
//直接补零的效果不是很好,因此这里不采用补零的方法,而是采用补边界的方法
/* else
*((unsigned char *)lpDst)=0;
*/
else if(i>height-1&&j<=width-1)
*((unsigned char *)lpDst)=*(lpDIBBits+j);
else if(i<=height-1&&j>width-1)
*((unsigned char *)lpDst)=*(lpDIBBits+LineBytes*(height-1-i)+width-1);
else
*((unsigned char *)lpDst)=*(lpDIBBits+width-1);
}
::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
::GlobalFree((HGLOBAL)pDoc->m_hDIB);
pDoc->m_hDIB=hDIB;
::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
pDoc=GetDocument();
unsigned char* lpNewBits;
LPSTR pDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());
lpNewBits=(unsigned char*)pDIB+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
LONG w,h;//图象中只有w=2^wp,h=2^hp的部分可以参加傅立叶变换
int wp,hp;
w=h=1;
wp=hp=0;
while(w*2<=newWidth)
{
w*=2;
wp++;
}
while(h*2<=newHeight)
{
h*=2;
hp++;
}
complex<double> *TD = new complex<double>[w * h];
complex<double> *FD = new complex<double>[w * h];
for(i=0;i<w;i++)
for(j=0;j<h;j++)
{
if((i+j)%2)
TD[j*w+i]=complex<double>(-*(lpNewBits+j*w+i),0);
else TD[j*w+i]=complex<double>(*(lpNewBits+j*w+i),0);
}
for(j=0;j<h;j++)
FFT(&TD[j*w],&FD[j*w],wp);//yan shuping fangxiang fft
for(i=0;i<w;i++)
for(j=0;j<h;j++)
TD[j*w+i]=FD[i*h+j];//zhuan zhi
for(j=0;j<w;j++)
FFT(&TD[j*h],&FD[j*h],hp);//yan shuping fangxiang fft
//now, w hang, h lie
for(i=0;i<h;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -