/***************************************************************************//** * @author Hayden Waisanen * * @par Description: * This function returns the standard deviation of intensities for the n by n * region centered at x-y in image. * * @param[in] x - center index for row * @param[in] y - center index for col * @param[in] n - dimension of area to filter * @param[in] image * * @returns int * ******************************************************************************/ int std_filter(int x, int y, int n, Image& image) { int intensities[256] = {0}; //Calculate upper left corner of n x n square int x_0 = x - ((n-1)/2); int y_0 = y - ((n-1)/2); int total = 0; int mean; int std; //Get intensity distribution intensity_distribution(image, x_0, y_0, n, intensities); //Calculate the mean for(int i = 0; i < 256; i++) total += i*intensities[i]; mean = total/(n*n); //Calculate the standard deviation total = 0; for(int i = 0; i < 256; i++) total += intensities[i] * (i - mean) * (i - mean); std = total / (n*n); std = qSqrt(std); return std; }
void Bioclimate::radiation_distribution (const size_t No, const double LAI, const double Ref, const double Si, const double Ext, std::vector <double>& Rad) { // Fraction of Photosynthetically Active Radiation in Shortware // incoming radiation. static const double PARinSi = 0.50; const double PAR0 = (1 - Ref) * PARinSi * Si; intensity_distribution (No, LAI, PAR0, Ext, Rad); }
/***************************************************************************//** * @author Hayden Waisanen * * @par Description: * This function returns the minimum intensity in the n by n region centered * at x-y in image. * * @param[in] x - center index for row * @param[in] y - center index for col * @param[in] n - dimension of area to filter * @param[in] image * * @returns int * ******************************************************************************/ int min_filter(int x, int y, int n, Image& image) { int intensities[256] = {0}; //Calculate upper left corner of n x n square int x_0 = x - ((n-1)/2); int y_0 = y - ((n-1)/2); int min_i = -1; //1 below min pixel intensity //Get intensity distribution intensity_distribution(image, x_0, y_0, n, intensities); //Find first nonzero intensity in both directions (max and min) while(intensities[++min_i] == 0); return min_i; }
/***************************************************************************//** * @author Hayden Waisanen * * @par Description: * This function returns the mean intensity in the n by n region centered * at x-y in image. * * @param[in] x - center index for row * @param[in] y - center index for col * @param[in] n - dimension of area to filter * @param[in] image * * @returns int * ******************************************************************************/ int mean_filter(int x, int y, int n, Image& image) { int intensities[256] = {0}; //Calculate upper left corner of n x n square int x_0 = x - ((n-1)/2); int y_0 = y - ((n-1)/2); int total = 0; //Get intensity distribution intensity_distribution(image, x_0, y_0, n, intensities); //Calculate the sum for(int i = 0; i < 256; i++) total += i*intensities[i]; return total/(n*n); //Return mean }
/***************************************************************************//** * @author Hayden Waisanen * * @par Description: * This function returns the median intensity in the n by n region centered * at x-y in image. * * @param[in] x - center index for row * @param[in] y - center index for col * @param[in] n - dimension of area to filter * @param[in] image * * @returns int * ******************************************************************************/ int median_filter(int x, int y, int n, Image& image) { int intensities[256] = {0}; //Calculate upper left corner of n x n square int x_0 = x - ((n-1)/2); int y_0 = y - ((n-1)/2); int middle_index = (n*n)/2; int total; int intensity; //Get the intensity distribution intensity_distribution(image, x_0, y_0, n, intensities); //Pin point index of the median intensity intensity = 0; total = intensities[intensity++]; while(total < middle_index) total += intensities[intensity++]; return intensity-1; }