2012年3月13日

影像處理:快速傅立葉轉換&&理想濾波器



1 則留言:

  1. using namespace std;
    int D0=0;
    void Transformation(IplImage *src)
    {
    CvScalar A;
    for(int i=0;iheight;i++)
    {
    for(int j=0;jwidth;j++)
    {
    A=cvGet2D(src,i,j);
    A.val[0]=(float)((float)A.val[0]*(float)pow(-1.0,i+j));
    cvSet2D(src,i,j,A);
    }
    }
    }

    void Ideal_Filter(IplImage *test,IplImage *image_temp,int Want,int D0)
    {
    CvScalar A,B;
    for(int i=0;iheight;i++)
    {
    for(int j=0;jwidth;j++)
    {
    float X,Y,Z;
    X=((float)(i-(test->height/2))*(float)(i-(test->height/2)));
    Y=((float)(j-(test->width/2))*(float)(j-(test->width/2)));
    (float)Z=X+Y;
    Z=sqrt(Z);
    if(Want==2)
    {
    if(Z>D0)
    {
    A=cvGet2D(test,i,j);
    A.val[0]=A.val[0]*0.0;
    A.val[1]=A.val[0]*0.0;
    cvSet2D(test,i,j,A);
    B=cvGet2D(image_temp,i,j);
    B.val[0]=B.val[0]*0.0;
    cvSet2D(image_temp,i,j,B);
    }
    }

    if(Want==3)
    {
    if(Z<=D0)
    {
    A=cvGet2D(test,i,j);
    A.val[0]=A.val[0]*0.0;
    A.val[1]=A.val[0]*0.0;
    cvSet2D(test,i,j,A);
    B=cvGet2D(image_temp,i,j);
    B.val[0]=B.val[0]*0.0;
    cvSet2D(image_temp,i,j,B);
    }
    }
    }
    }
    }


    int main()
    {
    int Want=0;
    cout<<"請輸入你的理想濾波器半徑距離!!"<>D0;
    cout<<"請輸入你要的選項,不要給我按別的數字喔!!"<>Want;
    CvScalar A,B;
    int M=0,N=0;
    double Max,Min;
    CvMat* DFT_A_Matrix,temp;
    IplImage *src,*real,*complex,*J_number,*image_real,*image_J_number,*image_temp,*image_temp1,*dst1,*test;
    src=cvLoadImage("D:\\img\\TestChart.bmp",-1);
    dst1=cvCreateImage( cvGetSize(src),IPL_DEPTH_8U,1);
    image_temp=cvCreateImage( cvGetSize(src),IPL_DEPTH_64F,1);
    image_temp1=cvCreateImage( cvGetSize(src),IPL_DEPTH_64F,1);
    real=cvCreateImage( cvGetSize(src),IPL_DEPTH_64F,1);
    J_number=cvCreateImage( cvGetSize(src),IPL_DEPTH_64F,1);
    complex=cvCreateImage( cvGetSize(src),IPL_DEPTH_64F,2);
    cvScale(src,real,1.0,0.0);

    Transformation(real);
    cvZero(J_number);
    cvMerge(real,J_number,NULL,NULL,complex);

    M=cvGetOptimalDFTSize(src->height-1);
    N=cvGetOptimalDFTSize(src->width-1);

    image_real=cvCreateImage( cvSize(N,M), IPL_DEPTH_64F, 1);
    image_J_number=cvCreateImage( cvSize(N,M), IPL_DEPTH_64F, 1);
    DFT_A_Matrix=cvCreateMat(M,N,CV_64FC2);
    test=cvCreateImage(cvSize(M,N),IPL_DEPTH_64F,2);
    cvZero(DFT_A_Matrix);
    cvGetSubRect(DFT_A_Matrix,&temp,cvRect(0,0,src->width,src->height));
    cvCopy(complex,&temp,NULL);
    cvDFT(DFT_A_Matrix,DFT_A_Matrix,CV_DXT_FORWARD,complex->height);
    cvCopy(DFT_A_Matrix,test,NULL);
    cvSplit(DFT_A_Matrix,image_real,image_J_number,0,0);

    cvPow(image_real,image_temp,2.0);
    cvPow(image_J_number,image_temp1,2.0);
    cvAdd(image_temp,image_temp,image_temp1,NULL);
    cvPow(image_temp,image_temp,0.5);

    cvAddS(image_temp,cvScalarAll(1.0),image_temp,NULL);
    cvLog(image_temp,image_temp);

    cvMinMaxLoc(image_temp,&Min,&Max,NULL,NULL,NULL);
    cvScale(image_temp,image_temp,1.0/(Max-Min),1.0*(-Min)/(Max-Min));

    Ideal_Filter(test,image_temp,Want,D0);

    cvDFT(test,test,CV_DXT_INVERSE_SCALE,complex->height);

    cvSplit(test,image_real,image_J_number,0,0);

    Transformation(image_real);

    cvScale(image_real,dst1,1.0,0.0);

    if(Want==1)
    {
    cvNamedWindow("image_temp",CV_WINDOW_AUTOSIZE);
    cvShowImage("image_temp",image_temp);

    }

    if(Want==2||Want==3)
    {
    cvNamedWindow("dst1",CV_WINDOW_AUTOSIZE);
    cvShowImage("dst1",dst1);
    cvNamedWindow("image_temp",CV_WINDOW_AUTOSIZE);
    cvShowImage("image_temp",image_temp);

    }

    cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
    cvShowImage("src",src);

    cvWaitKey(0);

    cvDestroyWindow("src");
    cvReleaseImage(&src);
    cvDestroyWindow("dst1");
    cvReleaseImage(&dst1);
    cvDestroyWindow("image_temp");
    cvReleaseImage(&image_temp);
    cvReleaseMat(&DFT_A_Matrix);

    }

    回覆刪除