Blame view

gauss_derivative_odd.cpp 3.31 KB
b71cc8bb   Tianshu Cheng   mPb using 3 channels
1
2
3
  #include <stim/image/image.h>
  #include <cmath>
  #include <stim/visualization/colormap.h>
40d11588   Tianshu Cheng   2D inseparable co...
4
  //#include <iostream>
b71cc8bb   Tianshu Cheng   mPb using 3 channels
5
6
7
  
  #define PI 3.1415926
  
40d11588   Tianshu Cheng   2D inseparable co...
8
9
10
11
12
  void conv2(float* img, float* mask, float* cpu_copy, unsigned int w, unsigned int h, unsigned int M);
  void array_abs(float* img, unsigned int N);
  void array_multiply(float* lhs, float rhs, unsigned int N);
  
  // winsize = 2 * r, side of mask = winsize + 1
b71cc8bb   Tianshu Cheng   mPb using 3 channels
13
14
  stim::image<float> gaussian_derivative_filter_odd(stim::image<float> image, float sigma, unsigned int sigma_n, unsigned int winsize, float theta, unsigned int w, unsigned int h){
  
e166b01b   Tianshu Cheng   simple mask test
15
  	stim::image<float> mask_x(winsize+1, winsize+1), mask_y(winsize+1, winsize+1), mask_theta(winsize+1, winsize+1), mask_test(winsize+1, winsize+1, 1), derivative_x, derivative_y, derivative_theta(w, h);
b71cc8bb   Tianshu Cheng   mPb using 3 channels
16
17
  	//float* ptr = mask_x.data();
  
e166b01b   Tianshu Cheng   simple mask test
18
19
20
21
22
  
  	memset ( mask_test.data(), 0,  mask_test.size() * sizeof(float));
  	mask_test.data()[winsize*(winsize+2)/2] = 1;
  	stim::cpu2image(mask_test.data(), "data_output/mask_test.bmp", winsize+1, winsize+1, stim::cmBrewer);
  
b71cc8bb   Tianshu Cheng   mPb using 3 channels
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
  
  	// set parameters
  	unsigned N = w * h;
  	float theta_r = (theta * PI)/180;
  
  	float step = (2*sigma*sigma_n)/winsize;
  
  	for (unsigned j = 0; j <= winsize; j++){
  		for (unsigned i = 0; i<= winsize; i++){
  
  			float x = (-1)*sigma*sigma_n + i * step;          //range of x
  			float y = (-1)*sigma*sigma_n + j * step;          //range of y
  
  			// create the x-oriented gaussian derivative filter mask_x
  			mask_x.data()[j*(winsize+1) + i] = (-1) * x * exp((-1)*(pow(x, 2))/(2*pow(sigma, 2))) * exp((-1)*(pow(y, 2))/(2*pow(sigma, 2)));
  			// create the y-oriented gaussian derivative filter mask_y
  			mask_y.data()[j*(winsize+1) + i] = (-1) * y * exp((-1)*(pow(y, 2))/(2*pow(sigma, 2))) * exp((-1)*(pow(x, 2))/(2*pow(sigma, 2)));
  			// create the mask_theta
  			mask_theta.data()[j*(winsize+1) + i] = cos(theta_r) * mask_x.data()[j*(winsize+1) + i] + sin(theta_r) * mask_y.data()[j*(winsize+1) + i] ;
  		
  		}
  	}
  
  	//stim::cpu2image(mask_x.data(), "data_output/cmapgray_mask_x.bmp", winsize+1, winsize+1, stim::cmBrewer);
  	
40d11588   Tianshu Cheng   2D inseparable co...
48
  	stim::cpu2image(image.data(), "data_output/image.bmp", w, h, stim::cmBrewer);
b71cc8bb   Tianshu Cheng   mPb using 3 channels
49
50
  
  
40d11588   Tianshu Cheng   2D inseparable co...
51
  	stim::cpu2image(mask_theta.data(), "data_output/mask.bmp", winsize+1, winsize+1, stim::cmBrewer);
b71cc8bb   Tianshu Cheng   mPb using 3 channels
52
53
  
  	// 2D convolution
40d11588   Tianshu Cheng   2D inseparable co...
54
55
  	//derivative_theta = image.convolve2(mask_theta);
  	//stim::cpu2image(derivative_theta.data(), "data_output/derivative_theta1.bmp", w, h, stim::cmBrewer);
e166b01b   Tianshu Cheng   simple mask test
56
  	//conv2(image.data(), mask_test.data(), derivative_theta.data(), w, h, winsize+1);
40d11588   Tianshu Cheng   2D inseparable co...
57
58
  	conv2(image.data(), mask_theta.data(), derivative_theta.data(), w, h, winsize+1);
  	//stim::cpu2image(derivative_theta.data(), "data_output/derivative_theta_tex1.bmp", w, h, stim::cmBrewer);
b71cc8bb   Tianshu Cheng   mPb using 3 channels
59
  
40d11588   Tianshu Cheng   2D inseparable co...
60
61
62
  	//array_abs(derivative_theta.data(), N);
  	
  	/*for (unsigned k = 0; k < w * h; k++){
b71cc8bb   Tianshu Cheng   mPb using 3 channels
63
64
65
  		
  		derivative_theta.data()[k] = abs(derivative_theta.data()[k]);
  
40d11588   Tianshu Cheng   2D inseparable co...
66
  	}*/
b71cc8bb   Tianshu Cheng   mPb using 3 channels
67
  
40d11588   Tianshu Cheng   2D inseparable co...
68
  	//stim::cpu2image(derivative_theta.data(), "data_output/derivative_theta2_abs.bmp", w, h, stim::cmBrewer);
b71cc8bb   Tianshu Cheng   mPb using 3 channels
69
  
40d11588   Tianshu Cheng   2D inseparable co...
70
71
72
73
74
  	/*float max = derivative_theta.max();
  
  	array_multiply(derivative_theta.data(), 1/max, N);*/
  
  	/*(
b71cc8bb   Tianshu Cheng   mPb using 3 channels
75
76
77
78
  	for (unsigned k = 0; k < w * h; k++){
  		
  		derivative_theta.data()[k] = derivative_theta.data()[k]/max;
  
40d11588   Tianshu Cheng   2D inseparable co...
79
  	})*/
b71cc8bb   Tianshu Cheng   mPb using 3 channels
80
81
82
83
84
85
86
87
88
  
  	//float max2 = derivative_theta.max();
  
  	//stim::cpu2image(derivative_theta.data(), "data_output/cmap_colorb_gradient_theta90_r5.bmp", w, h, stim::cmBrewer);
  	//derivative_x.save("data_output/gradient_x.bmp");
  
  	return derivative_theta;
  
  }