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

结果图片:

原文地址:https://www.cnblogs.com/tingshuixuan2012/p/4444189.html