Overview Write a C program that detects and reports on areas of brightness in th
ID: 3830942 • Letter: O
Question
Overview
Write a C program that detects and reports on areas of brightness in the night sky. You will input a portion of the night sky (from standard input) represented by an n × n grid of integers where n <= 500. Each value in the grid will indicate the detected brightness of that portion of the night sky with a 0 value indicating no light. Unfortunately the detection hardware sometimes reports erroneous values; these values will show up as negative numbers and must be filtered out prior to finding the bright spots. After preprocessing your data to filter out all of the noise (more on this below), your program must report the brightest coordinate and the brightness value for that coordinate in every 5 × 5 patch of the sky that contains no zeros. Report “(none)” if no bright spots exist. Keep in mind that bright areas may overlap, and that any bright spot should only be reported once. You should also report bright spots of the 5 × 5 areas you encounter as you scan the data in a top to bottom, left to right order.
You should preprocess your data to eliminate noise in following manner: for every negative value you encounter, average the (maximum of) 8 squares around it and replace the value with the average (rounded off to the nearest whole number; use nearbyint from math.h). If one of the surrounding squares also is negative, use the value of 0 in computing the average.
Your input will consist of a single integer s representing the size of the grid followed by s × s data values. Your output should be presented exactly like the sample run (using your name, of course, instead of mine). You also must use functions to input your data into an array, to preprocess your array, and one to find and report the bright spots. In other words you should have at least 3 separate functions defined that each are passed your two-dimensional data array where one function only inputs the array, one function only preprocesses the data to eliminate noise, and one function only finds and reports the bright spots. These functions must all be called from main. You must define your array local to your main function and pass it into all functions that need it. You may not declare and use any global data (other than possibly preprocessor definitions to define the maximum size of the sky and debugging flags if used).
Sample Run:
20
0 0 0 0 0 0 0 13 18 18 15 5 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 6 16 19 16 6 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 12 16 18 17 5 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 12 14 12 14 9 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 8 10 4 6 10 0 0 0 0 0 0
0 0 0 0 3 3 5 3 -2 10 12 11 11 6 0 0 0 0 0 0
0 0 0 0 5 6 6 6 5 7 13 14 13 4 0 0 0 0 0 0
0 0 0 0 2 7 8 6 4 8 12 13 11 9 0 0 0 0 0 0
0 0 0 0 2 7 7 7 5 9 4 10 6 4 0 0 0 -2 0 0
0 0 0 0 4 4 3 4 3 6 6 4 5 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 6 8 8 7 5 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 5 7 9 8 6 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 5 7 7 8 3 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 3 5 4 4 4 0 0 0 0 0 0 0
0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 -1 -1 -2 8 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Sample run using above data:
#include <stdio.h>
#include <math.h>
#define SIZE 500
// preprocess stage where it is calculating the brightness value by taking average of
// nearby cell if the cell value if less than 0
void preprocess(int brightness[SIZE][SIZE], int n)
{
int i, j;
// looping over 2 d array of brightness
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
// checking if value needs to be changed.
if (brightness[i][j] < 0)
{
double d = 0;
int count = 0;
// coordinate in above row
if (i - 1 >= 0)
{
d += brightness[i-1][j];
count++;
if (j -1 >= 0)
{
d+= brightness[i-1][j-1];
count++;
}
if (j + 1 < n)
{
d+= brightness[i-1][j+1];
count++;
}
}
// row just below
if (i + 1 < n)
{
d += brightness[i+1][j];
count++;
if (j - 1 >= 0)
{
d+= brightness[i+1][j-1];
count++;
}
if (j + 1 < n)
{
d+= brightness[i+1][j+1];
count++;
}
}
// coordinate just left
if (j - 1 >= 0)
{
d += brightness[i][j-1];
count++;
}
// coordinate just right
if (j + 1 < n)
{
d += brightness[i][j+1];
count++;
}
brightness[i][j] = (int)nearbyint(d/count);
}
}
}
}
// checking for bright spot in 5*5 grid starting from given i, j parameter being its left and top point
int findBrightSpotInSmaller(int brightness[SIZE][SIZE], int i, int j, int *coord1, int *coord2)
{
// will hold value of max
int max = brightness[i][j];
// coord's are given as reference so that value of
// coordinate of max brightness can be returned back to caller function
*coord1 = i;
*coord2 = j;
int r, c;
// looping over 5*5 brightness matrix
for(r = i; r < i+5; r++)
{
for(c = j; c < j+5; c++)
{
// if there is any cell with 0 value it returns
if (brightness[r][c] == 0)
{
return -1;
}
// checking if current value if greater than max then resetting max parameters
if (brightness[r][c] > max)
{
max = brightness[r][c];
*coord1 = r;
*coord2 = c;
}
}
}
// returning max
return max;
}
// function to print all bright spots in brightness matrix
void findBrightSpots(int brightness[SIZE][SIZE], int n)
{
// printing grid information
printf("Grid size: %dx%d ", n, n);
printf("Bright spots: ");
int i, j;
// array to keep track of bright point already reported and initializing it to 0
// meaning nothing has been reported
int reported[n][n];
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
reported[i][j] = 0;
}
}
// looping over array to consider each i, j as top left point of a 5*5 matrix
// and finding bright spot there.
for(i = 0; i <= n-5; i++)
{
for (j = 0; j <= n-5; j++)
{
int coord1, coord2;
int maxBright = findBrightSpotInSmaller(brightness, i, j, &coord1, &coord2);
// if bright spot is found, report it and set reported true for thsi point in reported matrix.
if (maxBright != -1)
{
if(reported[coord1][coord2] != 1)
{
printf("[%2d,%2d] %2d ", coord1, coord2, maxBright);
reported[coord1][coord2] = 1;
}
}
}
}
}
// take input from user for the brightness matrix
int inputBrightness(int brightness[SIZE][SIZE])
{
int n;
scanf("%d", &n);
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d", &brightness[i][j]);
}
}
return n;
}
int main()
{
// print project title and all your info that you need as per assignment
printf("Poject # ");
// declare matrix, max allowed size is 500*500
int brightness[SIZE][SIZE];
// take user input
int n = inputBrightness(brightness);
// preprocess negative value to take average
preprocess(brightness, n);
// find and report bright spots
findBrightSpots(brightness, n);
return 0;
}
Explanation / Answer
Brightness of the Night Sky :-
Professional scientists have been using images taken at night from satellites to detect and to measure the sources of light pollution and to estimate the sky brightness using models which take into account the scattering of light by molecules and aerosols of the atmosphere. This method provides a global estimation of the night sky brightness (i.e. Falchi and Cinzano, 1998; Kocifaj, 2007; Aub´e and Kocifaj, 2012). Astronomical spectroscopic observations can be used to determine not only the amount of light pollution but also the type of luminaries employed in public outdoor lighting. The bright emission lines of low- and high-pressure sodium lamps, and also metal halide and compact fluorescent lamps are the main features of the spectra of the light polluted skies (S´anchez de Miguel, 2015). Image observations to measure the magnitude of astronomical objects are performed using standard astronomical photometry methods. The images are taken through a filter and registered by a CCD detector. Its quantum efficiency or spectral response, in conjunction to the filter transmission, determines the photometric band. The contribution of the background sky can be estimated in the nearby field free of objects registered in the image and it should be subtracted to obtain the net flux of the object.
CODE
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.