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 }

浙公网安备 33010602011771号