Mode(hDC,COLORONCOLOR); CDibDoc *pDoc=GetDocument(); HDIB hdib; hdib=pDoc->GetHDIB(); BITMAPINFOHEADER *lpDIBHdr;//位图信息头结构指针; BYTE *lpDIBBits;//指向位图像素灰度值的指针; lpDIBHdr=( BITMAPINFOHEADER *)GlobalLock(hdib);//得到图像的位图头信息 lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);//获取图像像素值 BYTE* pData1; static int a[3][3]={{1,4,1},{4,-20,4},{1,4,1}};//拉普拉斯算子模板; int m,n,i,j,sum; int Width=lpDIBHdr->biWidth; int Height=lpDIBHdr->biHeight; pData1=(BYTE*)new char[WIDTHBYTES(Width*8)*Height]; file://进行拉普拉斯滤波运算; for(i=1;i<height-1;i++) </height-1;i++) for(j=1;j<width-1;j++) </width-1;j++) { sum=0; for(m=-1;m<2;m++) for(n=-1;n<2;n++) sum+=*(lpDIBBits+WIDTHBYTES(Width*8)*(i+m)+j+n)*a[1+m][1+n]; if(sum<0) sum=0; if(sum>255) sum=255; *(pData1+WIDTHBYTES(Width*8)*i+j)=sum; } file://原始图像pData减去拉普拉斯滤波处理后的图像pData1 for(i=0;i<height;i++) </height;i++) for(j=0;j<width;j++) </width;j++) { sum=(int)(*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)-4*(*(pData1+WIDTHBYTES(Width*8)*i+j))); if(sum<0) sum=0; if(sum>255) sum=255; *(lpDIBBits+WIDTHBYTES(Width*8)*i+j)=sum; } StretchDIBits (hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0, lpDIBHdr->biWidth,lpDIBHdr->biHeight, lpDIBBits,(LPBITMAPINFO)lpDIBHdr, DIB_RGB_COLORS, SRCCOPY); } |
(a)LENA原图 | (b)拉普拉斯锐化图 |
F(x,v)=N*[(1/N)* f(x,y)exp[-j2πvy/N]] (v=0,1,……,N-1) F(u,v)=(1/N)* F(x,v)exp[-j2πux/N] (u,v=0,1,……,N-1) |
F(x,v)= F(u,v)exp[j2πux/N] (x,y=0,1,……,N-1) f(x,y)=(1/N)* F(x,v)exp[j2πvy/N]] (y=0,1,……,N-1) |
int N=(int)pow(2,M); file://N:序列长度(2的整数次幂) ReverseOrder(A,N); file://对空间序列进行倒序 for(int i=1;i<=M;i++){ int b=(int)pow(2,(i-1)); for(int j=0;j<=(b-1);j++) { float p=(float)(pow(2,(M-i))*j*2.0*PI/(float)N); for(int k=j;k<=(N-1);){ float tr=(float)(A[k+b].Re*cos(p)+A[k+b].Im*sin(p)); file://计算复数运算A*U float ti=(float)(A[k+b].Im*cos(p)-A[k+b].Re*sin(p)); A[k+b].Re=A[k].Re-tr; file://复数运算A-tr A[k+b].Im=A[k].Im-ti; A[k].Re+=tr; file://复数运算A+tr A[k].Im+=ti; k+=b*2; } } } |
int WM=(int)(log(W)/log(2)+1.0f); file://计算图像宽应为2的多少次幂 int HM=(int)(log(H)/log(2)+1.0f); file://计算图像高应为2的多少次幂 WM=HM=max(WM,HM); file://取二者大值 int WN=(int)pow(2,WM); file://构造网格宽度 int HN=(int)pow(2,HM); file://构造网格高度 for{int i=0;i;for(int j=0;j if(i U[i*WN*3+j].Re=D[i*W*3+j]; file://D为图像序列 U[i*WN*3+j].Im=0.0f; }else file://缺位补0 U[i*WN*3+j].Re=U[i*WN*3+j].Im=0.0f; } } |
for(i=0;i for(int j=0;j UH[j].Re=U[j*WN*3+i].Re; UH[j].Im=U[j*WN*3+i].Im; } DFT_FFT(UH,HM); file://对UH进行快速离散傅立叶变换 for(j=0;j U[j*WN*3+i].Re=HN*UH[j].Re; file://N=HN U[j*WN*3+i].Im=HN*UH[j].Im; } } |
for(i=0;i<hn;i++){ </hn;i++){ for(int k=0;k<3;k++){ file://对24位位图的R、G、B三分量均各自进行变换 for(int j=0;j UW[j].Re=U[i*WN*3+j*3+k].Re; UW[j].Im=U[i*WN*3+j*3+k].Im; } DFT_FFT(UW,WM); file://对UW序列进行快速离散傅立叶变换 for(j=0;j U[i*WN*3+j*3+k].Re=UW[j].Re; U[i*WN*3+j*3+k].Im=UW[j].Im; } } } |
…… dsp.DFT_2D_FFT(m_cpBuffer+54,m_nWidth,m_nHeight,U); file://进行二维傅立叶变换 for(int i=0;i<hn;i++){ </hn;i++){ for(int j=0;j<wn*3;j++){ </wn*3;j++){ int k=(int)(j/3); D1=(float)sqrt(i*i+k*k); H=1.0f/(1+(D1/D0)*(D1/D0)); file://H(u,v)=1/(1+(u2+v2)/D02)) if(H>0.45f){ file://阀值 d取0.45 U[i*3*WN+j].Re/=H; file://在频域与M(u,v)相乘 U[i*3*WN+j].Im/=H; }else{ U[i*3*WN+j].Re*=0.6f; file://如未超过阀值则M(u,v)取常数k=0.6 U[i*3*WN+j].Im*=0.6f; } } } dsp.DFT_2D_IFFT(m_cpBuffer+54,m_nWidth,m_nHeight,U); file://进行傅立叶逆变换 |
F(u,v)=[(1/H(u,v))*(|H(u,v)|2)/(|H(u,v)|2+s*[Sn(u,v)/Sf(u,v)])]*G(u,v) |
F(u,v)=[(1/H(u,v))* (|H(u,v)|2)/(|H(u,v)|2+K)]*G(u,v) |
…… float K=0.05f; file://预先设定常数K dsp.DFT_2D_FFT(m_cpBuffer+54,m_nWidth,m_nHeight,U); file://转换到频域 for(int i=0;i<hn;i++){ </hn;i++){ for(int j=0;j int k=(int)(j/3); D1=(float)sqrt(i*i+k*k); float H=1.0f/(1+(D1/D0)*(D1/D0));//H(u,v)= 1/(1+(u2+v2)/D02)) U[i*3*WN+j].Re=(U[i*3*WN+j].Re*H)/(H*H+K); file://维纳滤波 U[i*3*WN+j].Im=(U[i*3*WN+j].Im*H)/(H*H+K); } } dsp.DFT_2D_IFFT(m_cpBuffer+54,m_nWidth,m_nHeight,U);//返回到空域 |
欢迎光临 EaBIM (https://eabim.net/) | Powered by Discuz! X3.2 |