Implement a function to compute basic statistics of a grayscale image represented as a 2D matrix of pixel values. In computer vision, images are often treated as 2D arrays where each element represents the intensity of a pixel, ranging from 0 (black) to 255 (white), and can be described using x and y coordinates.
The mean pixel value is a measure of the average intensity, calculated as the sum of all pixel values divided by the total number of pixels n. The minimum and maximum pixel values represent the darkest and brightest points in the image. The standard deviation measures the spread of pixel values from the mean, calculated using the variance formula.
Here are the steps to compute these statistics:
Flatten the 2D array into a 1D array of pixel values.
Calculate the mean pixel value.
Find the minimum and maximum pixel values.
Compute the variance and standard deviation.
Mean=n1i=1∑nxiσ=n1i=1∑n(xi−Mean)2
Use the population variance (divide by n, not n−1). Return a dictionary with keys 'mean', 'min', 'max' and 'std'; round the mean and standard deviation to 4 decimal places, and return min and max as the original integer pixel values.
This technique is widely used in image preprocessing and normalization.
Input:image is a 2×2 grid of grayscale intensities: top row 100,150, bottom row 200,50. All four pixels count equally, so n=4 and the row/column layout plays no part in the statistics.
Mean:4100+150+200+50=4500=125, reported as 125.0 because it is an average.
Min and max: the darkest pixel is 50 (bottom right) and the brightest is 200 (bottom left). These are actual pixel values, so they stay integers: 50 and 200.
Standard deviation: deviations from the mean are −25,25,75,−75; their squares are 625,625,5625,5625, summing to 12500. Dividing by n=4 gives variance 3125, and 3125≈55.90170, rounded to 4 decimal places gives 55.9017.
Notice: dividing by n−1=3 instead would give ≈64.5497, a different answer. And a uniform image such as all-255 has std 0, since every pixel sits exactly on the mean.
Constraints
Image is a 2D array with dimensions H×W where 1 ≤ H, W ≤ 100
In computer vision, a grayscale image is just a 2D matrix where each entry is a pixel intensity (brightness), usually an integer like 0–255. Thinking of the image as a matrix lets you treat image processing as numerical computation: you can sum pixels, scale them, or apply functions just like you would on any 2D array. Many later CV tasks (filtering, edge detection, feature extraction) assume you are comfortable viewing images as numeric data rather than pictures.
Basic statistics on pixel values—mean, min, max, standard deviation—are core tools for image preprocessing and normalization. For example, mean and standard deviation are often used to normalize images so that they have zero mean and unit variance, which can make learning algorithms more stable. Min and max can be used to rescale intensities to a standard range (like [0, 1]) or detect overexposed/underexposed images. At this level, the task is simply: “Given a 2D array of numbers, compute these scalar statistics.”
1. Background Knowledge
Mean pixel value:
If the image has H rows and W columns, and pixel intensities are I[i][j], the mean is
μ=H⋅W1∑i=0H−1∑j=0W−1I[i][j]
This measures the average brightness.
Min and max pixel values:
min=mini,jI[i][j],max=maxi,jI[i][j]
These show the darkest and brightest pixels in the image.
Standard deviation (population form):
σ=H⋅W1∑i,j(I[i][j]−μ)2
This tells you how spread out the pixel values are around the mean (contrast/variation).
All of these can be computed by treating the image as a flat list of N=H⋅W numbers and applying basic statistics.
2. Algorithm / General Approach
The common pattern here is a single pass aggregation over all pixels:
Traverse every element in the 2D array.
Maintain running values you need:
Sum of pixels (for mean).
Optional: sum of squared pixels (for variance/standard deviation).
Current min.
Current max.
After the traversal, compute:
Mean from the sum and count.
Variance (and then standard deviation) from sum, sum of squares, and count.
You can do this either:
In two passes:
1st pass: compute mean.
2nd pass: compute variance using the mean.
Or in one pass:
Maintain both sum and sum of squares while also tracking min and max.
3. Step-by-Step Strategy
Assume the image is a 2D array img with rows and cols.
Initialize accumulators:
total = 0.0
total_sq = 0.0
current_min = +infinity # or img
current_max = -infinity # or img
count = rows * cols
Loop over all pixels:
For each pixel = img[i][j]:
total += pixel
total_sq += pixel * pixel
current_min = min(current_min, pixel)
current_max = max(current_max, pixel)
Compute mean:
mean = total / count
Compute variance and standard deviation (population version):
If you are not using sum of squares, an alternative is:
Pass 1: compute mean.
Pass 2: compute sum((pixel - mean)**2) and then std_dev.
4. Common Pitfalls
Integer division:
If your language uses integer division by default, total / count might truncate. Cast to float before division.
Overflow with large sums:
If pixel values and image size are large, total or total_sq can overflow an int. Use a wider type (e.g., long, double, or float in many languages).
Negative variance from rounding:
In floating-point, (total_sq / count) - mean * mean can be slightly negative due to precision errors. Clamp very small negative values to zero before taking sqrt.
Empty image:
If rows or cols can be zero, you must define what to do (return zeros, error, etc.). Many platforms guarantee at least one pixel; check constraints.
Population vs. sample std dev:
The formula above uses N in the denominator (population). Some definitions use N - 1 (sample). Use the one the problem specifies; if not specified, population is typical in basic CV preprocessing.
5. Time & Space Complexity
Time Complexity:
You visit each pixel a constant number of times (once in a one-pass solution, twice in a two-pass solution).
Let N=H⋅W be the number of pixels.
Time: O(N)
Space Complexity:
You only store a few scalar accumulators in addition to the input image.