【练习5.8】使用随机数初始化图像、 双边滤波
题目要求 |
程序代码 |
结果图片 |
生成一个较小方差得随机图像(用一个随机变量,使其大部分数值的差异不超过3,其中大部分数值接近0),将此图像载入一个绘制程序,在图像上画一些辐射状相交于一点的线条。
a、对图像使用双边滤波。
1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 6 #include "stdafx.h" 7 #include <cv.h> 8 #include <highgui.h> 9 #include <iostream> 10 #include <math.h> 11 #include <stdlib.h> 12 using namespace cv; 13 using namespace std; 14 //函数声明-->--->-->--->-->--->-->--->// 15 16 double gaussrand(double E = 0.0, double V = 1.0); 17 void InitialzieImageToRandomValue(IplImage * img); 18 19 //<--<--<--<--<--<--<--<--<--函数声明// 20 21 int _tmain(int argc, _TCHAR* argv[]) 22 { 23 24 const char * fileName1 = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseResult\\Source_5-8_2.jpg"; 25 IplImage * src1 = cvLoadImage(fileName1, CV_LOAD_IMAGE_GRAYSCALE); 26 assert(src1); 27 28 //IplImage * img = cvCreateImage(cvSize(500, 500), IPL_DEPTH_8U, 1); 29 //assert(img); 30 //cvZero(img); 31 //InitialzieImageToRandomValue(img); 32 33 cvNamedWindow("原始图像", 0); 34 cvNamedWindow("题目_a", 0); 35 //cvNamedWindow("题目_b", 0); 36 //cvNamedWindow("题目_c", 0); 37 ////cvNamedWindow("题目_d", 0); 38 39 cvShowImage("原始图像", src1); 40 /*char * imageName = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseResult\\Result_5-8.jpg"; 41 cvSaveImage(imageName, img);*/ 42 43 //---------------------------a:开始--------------------------------// 44 45 IplImage * image_BIL = cvCloneImage(src1); 46 IplImage * temp_image = cvCloneImage(src1); 47 cvZero(temp_image); 48 cvZero(image_BIL); 49 50 cvSmooth(src1, temp_image, CV_BILATERAL, 3, 3, 11, 11); 51 52 int j = 0; 53 while (j < 100) 54 { 55 //注意:使用CV_BILATERAL平滑类型时cvSmooth参数中的最后两个11 56 cvSmooth(temp_image, image_BIL, CV_BILATERAL, 7, 7, 11, 11); 57 //cvSmooth(temp_image, image_BIL, CV_BILATERAL, 3, 3); 58 59 cvCopyImage(image_BIL, temp_image); 60 j++; 61 } 62 cvShowImage("题目_a", image_BIL); 63 char * imageName = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseResult\\Result_5-8_Step2.jpg"; 64 cvSaveImage(imageName, image_BIL); 65 //---------------------------a:结束--------------------------------// 66 67 cvWaitKey(0); 68 69 cvReleaseImage(&src1); 70 cvReleaseImage(&image_BIL); 71 //cvReleaseImage(&cleandiff); 72 //cvReleaseImage(&dirtydiff); 73 74 cvDestroyWindow("原始图像"); 75 cvDestroyWindow("题目_a"); 76 //cvDestroyWindow("题目_b"); 77 //cvDestroyWindow("题目_c"); 78 ////cvDestroyWindow("题目_d"); 79 80 81 return 0; 82 } 83 84 //生成的高斯分布随机数序列的期望为0.0,方差为1.0。若指定期望为E,方差为V,则只需增加:X = X * V + E; 85 //double gaussrand() 86 //{ 87 // static double V1, V2, S; 88 // static int phase = 0; 89 // double X; 90 // 91 // if (phase == 0) { 92 // do { 93 // double U1 = (double)rand() / RAND_MAX; 94 // double U2 = (double)rand() / RAND_MAX; 95 // 96 // V1 = 2 * U1 - 1; 97 // V2 = 2 * U2 - 1; 98 // S = V1 * V1 + V2 * V2; 99 // } while (S >= 1 || S == 0); 100 // 101 // X = V1 * sqrt(-2 * log(S) / S); 102 // } 103 // else 104 // X = V2 * sqrt(-2 * log(S) / S); 105 // 106 // phase = 1 - phase; 107 // 108 // return X; 109 //} 110 111 //声称期望为E,方差为V的随机数 112 double gaussrand(double E , double V ) 113 { 114 static double V1, V2, S; 115 static int phase = 0; 116 double X; 117 118 if (phase == 0) { 119 do { 120 double U1 = (double)rand() / RAND_MAX; 121 double U2 = (double)rand() / RAND_MAX; 122 123 V1 = 2 * U1 - 1; 124 V2 = 2 * U2 - 1; 125 S = V1 * V1 + V2 * V2; 126 } while (S >= 1 || S == 0); 127 128 X = V1 * sqrt(-2 * log(S) / S); 129 } 130 else 131 X = V2 * sqrt(-2 * log(S) / S); 132 133 phase = 1 - phase; 134 135 X = X * V + E; 136 return X; 137 } 138 139 void InitialzieImageToRandomValue(IplImage * img) 140 { 141 int imgWidth = img->width; 142 int imgHeight = img->height; 143 144 if (img->nChannels == 1) 145 { 146 for (int h = 0; h < imgHeight; ++h) 147 { 148 for (int w = 0; w < imgWidth; ++w) 149 { 150 int val = gaussrand(0.0, 3.0); 151 if (val >= 0) 152 { 153 cvSetReal2D(img, w, h, val); 154 } 155 else 156 { 157 w--; 158 } 159 } 160 } 161 } 162 }
‖==========钟于原创 乐于分享 宁静致远 毋忆典藏==========‖