Commit ba75208e4845f04d46f273f9cde8bd42f5a2683b

Authored by David Mayerich
1 parent 41acaf5d

change the name of mathvec.h to vector.h, fixed a bug in colormap.h

stim/cuda/imageproc/gaussian_blur.cuh deleted
1   -#ifndef STIM_CUDA_GAUSSIAN_BLUR_H
2   -#define STIM_CUDA_GAUSSIAN_BLUR_H
3   -
4   -#include <iostream>
5   -#include <cuda.h>
6   -#include "gaussian_blur.cuh"
7   -#include <stim/cuda/devices.h>
8   -
9   -#define pi 3.14159
10   -
11   -// This CUDA kernel applies a Gaussian blur along the x axis
12   -template<typename T>
13   -__global__ void gaussian_blur_x(T* out, T* in, T sigma, unsigned int x, unsigned int y){
14   -
15   - //calculate the 1D image index for this thread
16   - int i = blockIdx.x * blockDim.x + threadIdx.x;
17   -
18   - //convert this to 2D pixel coordinates
19   - int yi = i / x;
20   - int xi = i - (yi * x);
21   -
22   - int k_size = sigma * 4; //calculate the kernel size
23   -
24   - int gx, gy, gi; //variables to store global coordinates
25   - T sum = 0; //variable stores the integral of the kernel times the image
26   - T G; //stores the value of the gaussian kernel
27   -
28   - out[i] = 0;
29   - //for each element of the kernel
30   - for(int ki = -k_size; ki <= k_size; ki++){
31   -
32   - //calculate the gaussian value
33   - G = 1.0 / (sigma * sqrt(2 * pi)) * exp(-(ki*ki) / (2*sigma*sigma));
34   -
35   - //calculate the global coordinates for this point in the kernel
36   - gx = xi + ki;
37   - gy = yi;
38   -
39   - //make sure we are inside the bounds of the image
40   - if(gx >= 0 && gy >= 0 && gx < x && gy < y){
41   - gi = gy * x + gx;
42   -
43   - //perform the integration
44   - sum += G * in[gi];
45   - }
46   - }
47   -
48   - //set the output value to the integral of the function times the kernel
49   - out[i] = sum;
50   -}
51   -
52   -// This CUDA kernel applies a Gaussian blur along the y axis.
53   -template<typename T>
54   -__global__ void gaussian_blur_y(T* out, T* in, T sigma, unsigned int x, unsigned int y){
55   -
56   - //calculate the 1D image index for this thread
57   - int i = blockIdx.x * blockDim.x + threadIdx.x;
58   -
59   - //convert this to 2D pixel coordinates
60   - int yi = i / x;
61   - int xi = i - (yi * x);
62   -
63   - int k_size = sigma * 4; //calculate the kernel size
64   -
65   - int gx, gy, gi; //variables to store global coordinates
66   - T sum = 0; //variable stores the integral of the kernel times the image
67   - T G; //stores the value of the gaussian kernel
68   -
69   - out[i] = 0;
70   - //for each element of the kernel
71   - for(int ki = -k_size; ki <= k_size; ki++){
72   -
73   - //calculate the gaussian value
74   - G = 1.0 / (sigma * sqrt(2 * pi)) * exp(-(ki*ki) / (2*sigma*sigma));
75   -
76   - //calculate the global coordinates for this point in the kernel
77   - gx = xi;
78   - gy = yi + ki;
79   -
80   - //make sure we are inside the bounds of the image
81   - if(gx >= 0 && gy >= 0 && gx < x && gy < y){
82   - gi = gy * x + gx;
83   -
84   - //perform the integration
85   - sum += G * in[gi];
86   - }
87   - }
88   -
89   - //set the output value to the integral of the function times the kernel
90   - out[i] = sum;
91   -}
92   -
93   -/// Applies a Gaussian blur to a 2D image stored on the GPU
94   -template<typename T>
95   -void gpu_gaussian_blur_2d(T* image, T sigma, unsigned int x, unsigned int y){
96   -
97   - //get the number of pixels in the image
98   - unsigned int pixels = x * y;
99   - unsigned int bytes = sizeof(T) * pixels;
100   -
101   - //allocate temporary space on the GPU
102   - T* gpuI1;
103   - cudaMalloc(&gpuI1, bytes);
104   -
105   - //get the maximum number of threads per block for the CUDA device
106   - int threads = stim::maxThreadsPerBlock();
107   -
108   - //calculate the number of blocks
109   - int blocks = pixels / threads + (pixels%threads == 0 ? 0:1);
110   -
111   - //run the kernel for the x dimension
112   - gaussian_blur_x <<< blocks, threads >>>(gpuI1, image, sigma, x, y);
113   -
114   - //run the kernel for the y dimension
115   - gaussian_blur_y <<< blocks, threads >>>(image, gpuI1, sigma, x, y);
116   -
117   -}
118   -
119   -/// Applies a Gaussian blur to a 2D image stored on the CPU
120   -template<typename T>
121   -void cpu_gaussian_blur_2d(T* image, T sigma, unsigned int x, unsigned int y){
122   -
123   - //get the number of pixels in the image
124   - unsigned int pixels = x * y;
125   - unsigned int bytes = sizeof(T) * pixels;
126   -
127   - //allocate space on the GPU
128   - T* gpuI0;
129   - cudaMalloc(&gpuI0, bytes);
130   -
131   - //copy the image data to the GPU
132   - cudaMemcpy(gpuI0, image, bytes, cudaMemcpyHostToDevice);
133   -
134   - //run the GPU-based version of the algorithm
135   - gpu_gaussian_blur_2d<T>(gpuI0, sigma, x, y);
136   -
137   - //copy the image data from the device
138   - cudaMemcpy(image, gpuI0, bytes, cudaMemcpyDeviceToHost);
139   -}
140   -
141   -#endif
stim/envi/binary.h
... ... @@ -100,7 +100,7 @@ public:
100 100 /// @param filename is the name of the binary file
101 101 /// @param r is a STIM vector specifying the size of the binary file along each dimension
102 102 /// @param h is the length (in bytes) of any header file (default zero)
103   - bool open(std::string filename, vec<unsigned int, D> r, unsigned int h = 0){
  103 + bool open(std::string filename, vec<unsigned int> r, unsigned int h = 0){
104 104  
105 105 for(unsigned int i = 0; i < D; i++) //set the dimensions of the binary file object
106 106 R[i] = r[i];
... ... @@ -117,7 +117,7 @@ public:
117 117 /// @param filename is the name of the binary file to be created
118 118 /// @param r is a STIM vector specifying the size of the file along each dimension
119 119 /// @offset specifies how many bytes to offset the file (used to leave room for a header)
120   - bool create(std::string filename, vec<unsigned int, D> r, unsigned int offset = 0){
  120 + bool create(std::string filename, vec<unsigned int> r, unsigned int offset = 0){
121 121  
122 122 std::ofstream target(filename.c_str(), std::ios::binary);
123 123  
... ...
stim/math/mathvec.h renamed to stim/math/vector.h
stim/visualization/colormap.h
... ... @@ -287,7 +287,7 @@ static void cpu2cpu(T* cpuSource, unsigned char* cpuDest, unsigned int nVals, T
287 287 }
288 288  
289 289 template<class T>
290   -static void cpu2cpu(T* cpuSource, unsigned char* cpuDest, unsigned int nVals, colormapType cm = cmGrayscale)//, bool positive = false)
  290 +static void cpu2cpu(T* cpuSource, unsigned char* cpuDest, unsigned int nVals, colormapType cm = cmGrayscale)
291 291 {
292 292 //computes the max and min range automatically
293 293  
... ... @@ -329,13 +329,13 @@ static void cpu2image(T* cpuSource, std::string fileDest, unsigned int x_size, u
329 329 }
330 330  
331 331 template<typename T>
332   -static void cpu2image(T* cpuSource, std::string fileDest, unsigned int x_size, unsigned int y_size, colormapType cm = cmGrayscale, bool positive = false)
  332 +static void cpu2image(T* cpuSource, std::string fileDest, unsigned int x_size, unsigned int y_size, colormapType cm = cmGrayscale)
333 333 {
334 334 //allocate a color buffer
335 335 unsigned char* cpuBuffer = (unsigned char*) malloc(sizeof(unsigned char) * 3 * x_size * y_size);
336 336  
337 337 //do the mapping
338   - cpu2cpu<T>(cpuSource, cpuBuffer, x_size * y_size, cm, positive);
  338 + cpu2cpu<T>(cpuSource, cpuBuffer, x_size * y_size, cm);
339 339  
340 340 //copy the buffer to an image
341 341 buffer2image(cpuBuffer, fileDest, x_size, y_size);
... ...