Commit 40d11588d501812254ef602402ec5143c4080da3

Authored by Tianshu Cheng
1 parent b5c39899

2D inseparable convolution

cudafunc.cu
1   -#include <stim/cuda/gaussian_blur.cuh>
  1 +#include <stim/cuda/arraymath.cuh>
2 2  
3   -void blur(float* image, float sigma, unsigned int x, unsigned int y){
  3 +/*void blur(float* image, float sigma, unsigned int x, unsigned int y){
4 4  
5 5 stim::cuda::cpu_gaussian_blur_2d<float>(image, sigma, x, y);
6   -}
7 6 \ No newline at end of file
  7 +}*/
  8 +
  9 +void array_multiply(float* lhs, float rhs, unsigned int N){
  10 +
  11 + stim::cuda::cpu_multiply(lhs, rhs, N);
  12 +}
  13 +
  14 +void array_add(float* ptr1, float* ptr2, float* sum, unsigned int N){
  15 +
  16 + stim::cuda::cpu_add(ptr1, ptr2, sum, N);
  17 +
  18 +}
  19 +
  20 +void conv2(float* img, float* mask, float* cpu_copy, unsigned int w, unsigned int h, unsigned int M){
  21 +
  22 + stim::cuda::cpu_conv2(img, mask, cpu_copy, w, h, M);
  23 +
  24 +}
  25 +
  26 +void array_abs(float* img, unsigned int N){
  27 +
  28 + stim::cuda::cpu_abs(img, N);
  29 +
  30 +}
  31 +
... ...
fun_mPb_theta.cpp
... ... @@ -4,6 +4,9 @@
4 4 #include <stim/visualization/colormap.h>
5 5 #include <stim/image/image_contour_detection.h>
6 6  
  7 +void array_multiply(float* lhs, float rhs, unsigned int N);
  8 +void array_add(float* ptr1, float* ptr2, float* sum, unsigned int N);
  9 +
7 10 stim::image<float> func_mPb_theta(stim::image<float> lab, float theta, unsigned int w, unsigned int h){
8 11  
9 12 stim::image<float> mPb_theta(w, h, 1);
... ... @@ -26,16 +29,25 @@ stim::image&lt;float&gt; func_mPb_theta(stim::image&lt;float&gt; lab, float theta, unsigned
26 29 stim::image<float> l1,l2,l3,a1,a2,a3,b1,b2,b3;
27 30  
28 31 l1 = gaussian_derivative_filter_odd(pic_light, sigma, sigma_n, r1 * 2, theta, w, h);
  32 + stim::cpu2image(l1.data(), "data_output/l1_tex.bmp", w, h, stim::cmBrewer);
29 33 l2 = gaussian_derivative_filter_odd(pic_light, sigma, sigma_n, r2 * 2, theta, w, h);
  34 + stim::cpu2image(l2.data(), "data_output/l2_tex.bmp", w, h, stim::cmBrewer);
30 35 l3 = gaussian_derivative_filter_odd(pic_light, sigma, sigma_n, r3 * 2, theta, w, h);
  36 + stim::cpu2image(l3.data(), "data_output/l3_tex.bmp", w, h, stim::cmBrewer);
31 37 a1 = gaussian_derivative_filter_odd(pic_colora, sigma, sigma_n, r2 * 2, theta, w, h);
  38 + stim::cpu2image(a1.data(), "data_output/a1_tex.bmp", w, h, stim::cmBrewer);
32 39 a2 = gaussian_derivative_filter_odd(pic_colora, sigma, sigma_n, r3 * 2, theta, w, h);
  40 + stim::cpu2image(a2.data(), "data_output/a2_tex.bmp", w, h, stim::cmBrewer);
33 41 a3 = gaussian_derivative_filter_odd(pic_colora, sigma, sigma_n, r4 * 2, theta, w, h);
  42 + stim::cpu2image(a3.data(), "data_output/a3_tex.bmp", w, h, stim::cmBrewer);
34 43 b1 = gaussian_derivative_filter_odd(pic_colorb, sigma, sigma_n, r2 * 2, theta, w, h);
  44 + stim::cpu2image(b1.data(), "data_output/b1_tex.bmp", w, h, stim::cmBrewer);
35 45 b2 = gaussian_derivative_filter_odd(pic_colorb, sigma, sigma_n, r3 * 2, theta, w, h);
  46 + stim::cpu2image(b2.data(), "data_output/b2_tex.bmp", w, h, stim::cmBrewer);
36 47 b3 = gaussian_derivative_filter_odd(pic_colorb, sigma, sigma_n, r4 * 2, theta, w, h);
  48 + stim::cpu2image(b3.data(), "data_output/b3_tex.bmp", w, h, stim::cmBrewer);
37 49  
38   - for (unsigned i = 0; i<N; i++){
  50 + /*for (unsigned i = 0; i<N; i++){
39 51  
40 52 mPb_theta.data()[i] = l1.data()[i] * alpha[0] +
41 53 l2.data()[i] * alpha[1] +
... ... @@ -47,9 +59,32 @@ stim::image&lt;float&gt; func_mPb_theta(stim::image&lt;float&gt; lab, float theta, unsigned
47 59 b2.data()[i] * alpha[7] +
48 60 b3.data()[i] * alpha[8] ;
49 61  
50   - }
  62 + }*/
  63 +
  64 +
  65 + array_multiply(l1.data(), alpha[0], N);
  66 + //stim::cpu2image(l1.data(), "data_output/array_add_l1.bmp", w, h, stim::cmBrewer);
  67 + array_multiply(l2.data(), alpha[1], N);
  68 + //stim::cpu2image(l2.data(), "data_output/array_add_l2.bmp", w, h, stim::cmBrewer);
  69 + array_multiply(l3.data(), alpha[2], N);
  70 + array_multiply(a1.data(), alpha[3], N);
  71 + array_multiply(a2.data(), alpha[4], N);
  72 + array_multiply(a3.data(), alpha[5], N);
  73 + array_multiply(b1.data(), alpha[6], N);
  74 + array_multiply(b2.data(), alpha[7], N);
  75 + array_multiply(b3.data(), alpha[8], N);
  76 +
  77 + array_add(l1.data(), l2.data(), mPb_theta.data(), N);
  78 + //stim::cpu2image(sum, "data_output/array_add_sum.bmp", w, h, stim::cmBrewer);
  79 + array_add(mPb_theta.data(), l3.data(), mPb_theta.data(), N);
  80 + array_add(mPb_theta.data(), a1.data(), mPb_theta.data(), N);
  81 + array_add(mPb_theta.data(), a2.data(), mPb_theta.data(), N);
  82 + array_add(mPb_theta.data(), a3.data(), mPb_theta.data(), N);
  83 + array_add(mPb_theta.data(), b1.data(), mPb_theta.data(), N);
  84 + array_add(mPb_theta.data(), b2.data(), mPb_theta.data(), N);
  85 + array_add(mPb_theta.data(), b3.data(), mPb_theta.data(), N);
51 86  
52   - //stim::cpu2image(mPb_theta.data(), "data_output/cmap_mPb_theta0.bmp", w, h, stim::cmBrewer);
  87 + //stim::cpu2image(mPb_theta.data(), "data_output/mPb_theta0_1.bmp", w, h, stim::cmBrewer);
53 88  
54 89  
55 90 //getch();
... ...
func_mPb.cpp
... ... @@ -20,9 +20,9 @@ stim::image&lt;float&gt; func_mPb(stim::image&lt;float&gt; lab, unsigned int theta_n, unsign
20 20 float* ptr;
21 21 ptr = (float*) malloc(size * sizeof(float) * theta_n);
22 22  
23   - for (unsigned int n = 0; n < 1; n++){
  23 + for (unsigned int n = 0; n < theta_n; n++){
24 24  
25   - ss << "data_output/mPb_theta"<< n << ".bmp";
  25 + ss << "data_output/mPb_theta"<< n << "_conv2.bmp";
26 26 float theta = 180 * ((float)n/theta_n);
27 27  
28 28 mPb_theta = func_mPb_theta(lab, theta, w, h);
... ... @@ -37,7 +37,7 @@ stim::image&lt;float&gt; func_mPb(stim::image&lt;float&gt; lab, unsigned int theta_n, unsign
37 37 unsigned long idx = n * w * h * 1; //index for the nth slice
38 38  
39 39 std::string sss = ss.str();
40   - stim::cpu2image(&ptr[idx], sss, w, h, stim::cmBrewer);
  40 + //stim::cpu2image(&ptr[idx], sss, w, h, stim::cmBrewer);
41 41  
42 42  
43 43 for(unsigned long i = 0; i < N; i++){
... ... @@ -57,7 +57,7 @@ stim::image&lt;float&gt; func_mPb(stim::image&lt;float&gt; lab, unsigned int theta_n, unsign
57 57 ss.str("");
58 58 }
59 59  
60   - stim::cpu2image(mPb.data(), "data_output/mPb.bmp", w, h, stim::cmBrewer);
  60 + //stim::cpu2image(mPb.data(), "data_output/mPb_conv2.bmp", w, h, stim::cmBrewer);
61 61  
62 62 double duration2 = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
63 63 std::cout<<"total time:"<< duration2 <<"s"<<'\n';
... ...
gauss_derivative_odd.cpp
1 1 #include <stim/image/image.h>
2 2 #include <cmath>
3 3 #include <stim/visualization/colormap.h>
4   -#include <iostream>
  4 +//#include <iostream>
5 5  
6 6 #define PI 3.1415926
7 7  
  8 +void conv2(float* img, float* mask, float* cpu_copy, unsigned int w, unsigned int h, unsigned int M);
  9 +void array_abs(float* img, unsigned int N);
  10 +void array_multiply(float* lhs, float rhs, unsigned int N);
  11 +
  12 +// winsize = 2 * r, side of mask = winsize + 1
8 13 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){
9 14  
10 15 stim::image<float> mask_x(winsize+1, winsize+1), mask_y(winsize+1, winsize+1), mask_theta(winsize+1, winsize+1), derivative_x, derivative_y, derivative_theta(w, h);
... ... @@ -38,27 +43,37 @@ stim::image&lt;float&gt; gaussian_derivative_filter_odd(stim::image&lt;float&gt; image, floa
38 43  
39 44 //stim::cpu2image(mask_x.data(), "data_output/cmapgray_mask_x.bmp", winsize+1, winsize+1, stim::cmBrewer);
40 45  
41   - //stim::cpu2image(mask_y.data(), "data_output/cmapgray_mask_y.bmp", winsize+1, winsize+1, stim::cmBrewer);
  46 + stim::cpu2image(image.data(), "data_output/image.bmp", w, h, stim::cmBrewer);
42 47  
43 48  
44   - //stim::cpu2image(mask_theta.data(), "data_output/cmapgray_mask_theta.bmp", winsize+1, winsize+1, stim::cmBrewer);
  49 + stim::cpu2image(mask_theta.data(), "data_output/mask.bmp", winsize+1, winsize+1, stim::cmBrewer);
45 50  
46 51 // 2D convolution
47   - derivative_theta = image.convolve2(mask_theta);
  52 + //derivative_theta = image.convolve2(mask_theta);
  53 + //stim::cpu2image(derivative_theta.data(), "data_output/derivative_theta1.bmp", w, h, stim::cmBrewer);
  54 + conv2(image.data(), mask_theta.data(), derivative_theta.data(), w, h, winsize+1);
  55 + //stim::cpu2image(derivative_theta.data(), "data_output/derivative_theta_tex1.bmp", w, h, stim::cmBrewer);
48 56  
49   - for (unsigned k = 0; k < w * h; k++){
  57 + //array_abs(derivative_theta.data(), N);
  58 +
  59 + /*for (unsigned k = 0; k < w * h; k++){
50 60  
51 61 derivative_theta.data()[k] = abs(derivative_theta.data()[k]);
52 62  
53   - }
  63 + }*/
54 64  
55   - float max = derivative_theta.max();
  65 + //stim::cpu2image(derivative_theta.data(), "data_output/derivative_theta2_abs.bmp", w, h, stim::cmBrewer);
56 66  
  67 + /*float max = derivative_theta.max();
  68 +
  69 + array_multiply(derivative_theta.data(), 1/max, N);*/
  70 +
  71 + /*(
57 72 for (unsigned k = 0; k < w * h; k++){
58 73  
59 74 derivative_theta.data()[k] = derivative_theta.data()[k]/max;
60 75  
61   - }
  76 + })*/
62 77  
63 78 //float max2 = derivative_theta.max();
64 79  
... ...
test_main.cpp
... ... @@ -9,11 +9,14 @@ void main()
9 9 {
10 10 stim::image<float> rgb,gaussgradient; //generate an image object
11 11  
  12 + //unsigned int a = 5%5;
  13 + //unsigned int b = 5/5;
  14 +
12 15 rgb.load("101087.bmp"); //load the input image
13 16 unsigned int w = rgb.width(); //get the image size
14 17 unsigned int h = rgb.height();
15 18 unsigned int s = rgb.size();
16   - unsigned a = sizeof(float);
  19 + //unsigned a = sizeof(float);
17 20  
18 21 stim::image<float> lab; //create an image object for a single-channel (grayscale) image
19 22 lab = rgb.srgb2lab(); //create the single-channel image
... ...