#ifndef STIM_CUDA_CPB_CUH #define STIM_CUDA_CPB_CUH #include #include #include #include #include #include //BSDS500 files #include "Pb.cuh" //void array_multiply(float* lhs, float rhs, unsigned int N); //void array_add(float* ptr1, float* ptr2, float* sum, unsigned int N); /// This function evaluates the cPb given an multi-channel image /// @param img is the multi-channel image /// @param r is an array of radii for different scaled discs(filters) /// @param alpha is is an array of weights for different scaled discs(filters) /// @param s is the number of scales stim::image cPb(stim::image img, int* sigma, float* alpha, int s){ unsigned int w = img.width(); // get the width of picture unsigned int h = img.height(); // get the height of picture unsigned int c = img.channels(); // get the channels of picture stim::image cPb(w, h, 1); // allocate space for cPb unsigned size = cPb.size(); // get the size of cPb memset ( cPb.data(), 0, size * sizeof(float)); // initialize all the pixels of cPb to 0 unsigned int N = w * h; // get the number of pixels //std::ostringstream ss; // (optional) set the stream to designate the test result file stim::image temp; // set the temporary image to store the addtion result for (int i = 0; i < c; i++){ for (int j = 0; j < s; j++){ //ss << "data_output/cPb_slice"<< i*s + j << ".bmp"; // set the name for test result file (optional) //std::string sss = ss.str(); // get the gaussian gradient by convolving each image slice with the mask temp = Pb(img.channel(i), sigma[i*s + j]); // output the test result of each slice (optional) //stim::cpu2image(temp.data(), sss, w, h, stim::cmBrewer); // multiply each gaussian gradient with its weight stim::cuda::cpu_multiply(temp.data(), alpha[i*s + j], N); // add up all the weighted gaussian gradients stim::cuda::cpu_add(cPb.data(), temp.data(), cPb.data(), N); //ss.str(""); //(optional) clear the space for stream } } float max = cPb.maxv(); // get the maximum of cPb used for normalization stim::cuda::cpu_multiply(cPb.data(), 1/max, N); // normalize the cPb // output the test result of cPb (optional) //stim::cpu2image(cPb.data(), "data_output/cPb_0916.bmp", w, h, stim::cmBrewer); return cPb; } #endif