3*3高斯,BOX,拉普拉斯滤波的实现

3*3高斯,BOX,拉普拉斯滤波的实现

  1 #include"iostream"
  2 using namespace std;
  3 #include<cv.h>
  4 #include<cxcore.h>
  5 #include<highgui.h>
  6 
  7 /*邻域平均法*/
  8 void average_filter(IplImage *src,IplImage *&dst,int kernel[5][3],int row,int column,int average_argument)
  9 {
 10     int number = row*column;            //储存模板数组,使得一维化
 11     int *temp_array = new int[number];
 12 
 13     int *temp_img = new int[number];    //储存要用到的相关点
 14     int k = 0;
 15 
 16 
 17     for(int i=0;i<row;i++)
 18         for(int j=0;j<column;j++)
 19             temp_array[k++] = kernel[i][j];
 20 
 21 
 22 
 23 
 24 
 25     int height = src->height;
 26     int width = src->width;
 27     for(int y=0; y<height; y++)
 28     {
 29         for(int x=0; x<width; x++)
 30         {
 31             int k=0;
 32             int row_use = row/2;
 33             for(int i=y-row_use; i<=y+row_use; i++)            //相关row*column点储存起来
 34             {
 35                 for(int j=x-row_use; j<=x+row_use; j++)
 36                 {
 37                     /*如果越界,让它等于某个接近他的图像已有数值*/
 38                     int num_r = i;                            
 39                     int num_c = j;
 40                     while(num_r<0)
 41                         num_r++;
 42 
 43                     while(num_r>=src->height)
 44                         num_r--;
 45 
 46                     while(num_c<0)
 47                         num_c++;
 48 
 49                     while(num_c>=src->width)
 50                         num_c--;
 51                     /******************************************/
 52                     temp_img[k] = (int)((uchar*)(src->imageData + num_r*src->width))[num_c];
 53 
 54                     k++;
 55                 }
 56             }
 57 
 58 
 59 
 60             int sum=0;
 61             for(int i=0;i<row*column;i++)
 62                 sum += (temp_img[i] * temp_array[i]);
 63             sum = sum/average_argument;
 64             ((uchar*)(dst->imageData+dst->width*y))[x] = sum;
 65         }
 66     }
 67     delete []temp_array;
 68     delete []temp_img;
 69 }
 70 
 71 
 72 
 73 
 74 int main()
 75 {
 76     IplImage *cvimage,*pgray,*gaussian_pgray,*box_pgray,*laplace_pgray;
 77     cvimage = cvLoadImage(".//photo//lena.jpg");
 78 
 79 
 80     pgray = cvCreateImage(cvGetSize(cvimage),IPL_DEPTH_8U,1);  //强制转化到灰度图
 81     cvCvtColor(cvimage,pgray,CV_RGB2GRAY);
 82 
 83     gaussian_pgray = cvCreateImage(cvGetSize(cvimage),IPL_DEPTH_8U,1);//高斯模糊
 84     box_pgray = cvCreateImage(cvGetSize(cvimage),IPL_DEPTH_8U,1);      /*BOX邻域平均*/
 85     laplace_pgray = cvCreateImage(cvGetSize(cvimage),IPL_DEPTH_8U,1);  /*laplace锐化*/
 86     
 87 
 88     /*高斯邻域平均*/
 89     int gaussian[3][3] = {
 90         1,2,1,
 91         2,4,2,
 92         1,2,1
 93     };
 94     average_filter(pgray,gaussian_pgray,gaussian,3,3,16);
 95 
 96     /*box邻域平均*/
 97     int boxmodel[3][3] = { 
 98         1,1,1,
 99         1,1,1,
100         1,1,1
101     };
102     average_filter(pgray,box_pgray,boxmodel,3,3,9);
103 
104     /*拉普拉斯锐化*/
105     int laplace[3][3] = {
106                 1,-2,1,
107                 -2,4,-2,
108                 1,-2,1
109     };
110     
111     average_filter(gaussian_pgray,laplace_pgray,laplace,3,3,1);
112     cvNamedWindow("去噪以后laplace",1);
113     cvShowImage("去噪以后laplace",laplace_pgray);
114     
115     average_filter(pgray,laplace_pgray,laplace,3,3,1);
116     cvNamedWindow("未去噪laplace",1);
117     cvShowImage("未去噪laplace",laplace_pgray);
118     
119 
120     cvNamedWindow("src",1);
121     cvShowImage("src",pgray);
122 
123     cvNamedWindow("gaussian",1);
124     cvShowImage("gaussian",gaussian_pgray);
125 
126     //cvNamedWindow("boxmode",1);
127     //cvShowImage("boxmode",box_pgray);
128     
129     cvNamedWindow("laplace",1);
130     cvShowImage("laplace",laplace_pgray);
131 
132     cvWaitKey(0);
133 
134 
135     cvDestroyWindow("src");
136     cvDestroyWindow("gaussian");
137     cvDestroyWindow("boxmode");
138     cvDestroyWindow("去噪以后laplace");
139 
140     cvReleaseImage(&pgray);
141     cvReleaseImage(&gaussian_pgray);
142     cvReleaseImage(&cvimage);
143     cvReleaseImage(&box_pgray);
144     return 1;
145 }

 

posted @ 2013-01-10 09:57  wangyu2012  阅读(969)  评论(0)    收藏  举报