【練習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 }
結果画像: