/***************************************************************************//**
 * @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;
}
Esempio n. 2
0
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;
}