好記性不如爛筆頭,紀錄工作與生活上遭遇的點點滴滴。
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);}
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);
}