【练习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 }

 

 

结果图片:

 

你可能感兴趣的:(初始化)