【練習5.8】乱数による画像初期化、二重フィルタリング

21799 ワード


アウトライン
テーマの要件
プログラムコード
結果画像
 
 
 
  
タイトルの要件:
 小さい方差のランダム画像を生成し(ランダム変数を使用して、ほとんどの数値の差が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 }
 
 
結果画像: