# How can I measure noise and sharpness of an image?

I'm working on a project which ranked some images based on quality.

For this project, I want to figure out the noise and the sharpness from a image.

1. To calculate the noise (from a CCD-Sensor) I think I can calculate the average noise from a image. How could I do this? I've read something about MSE, PSNR and SSIM. However, all these require a second image. Or is there a modification, so as I can use these algorithms for one image?
2. To calculate a value which represent the sharpness I have no idea. Maybe I can calculate the peak with the sharpest point of the image (because there are different kinds like out-of-focus or motion-blur)

Is there an available reference paper or an implementation in any language?

Update Can I use (slanted-edge) MTF to measure sharpness? I need some normalized metric to compare sharpness between images. Or is there a better solution? A stand alone Laplacian is not normalized, I think.

• For noise level, try standard deviation; for sharpness, try Laplacian filter – chaohuang Aug 25 '12 at 14:39
• Can i use the laplacian filter to get a normalized value between 0 and 1 (ore something else?), so i can compare sharpnes between images? – 501 - not implemented Sep 4 '12 at 16:30
• If You want to optimize the image, have You tried image entropy? – Doc Sep 17 '12 at 9:03
• no i only want to score the image for a image-ranking-system – 501 - not implemented Sep 18 '12 at 15:32

Simply, you can not 'calculate' the noise from single observation. Rather, you can estimate the target signal (denoised form), and then by using this estimation, you can determine the noise level. If the observation $y = x + n$ where the $x$ is target and $n$ is noise, after estimation of $x$ (via standart denoising methods), you can calculate the MSE, the SNR or other measures for noise level by using estimation $x$ and observation $y$. Of course these values will depend on the denoising method you use to estimate $x$, which can critically change the result.

• The first sentence is spot on! But isn't the OP assuming stationary noise across the image as a way to estimate it? – jtlz2 Dec 18 '18 at 11:05

In a CCD the noise is dominated by a common output amplifier (or often a separate amplifier for each quadrant) so if you take a dark frame with no photon signal the variation in the data is due only to the amplifier noise - and so you can simply take a standard deviation of all the pixels.

With a commercial, rather than scientific, camera you might not be able to get a low enough signal that shot noise isn't significant.

I would recommend ImageJ as a start. There is a built in function to remove noise, and you can plot the before and after noise graphs by using ctrl-k. The graph clearly becomes much smoother and one should be able to derive a score by comparing either graphs

One approach to estimating the noise level is simply to measure the standard deviation of the grey-level histogram of continuous regions of the image (those regions close to uniformity in the scene). Whilst some variability is expected in any image, a large component of this distribution will be due to image noise. The utility of this measure will depend a lot on the construction of the scene and what you need to know but it may help rank the quality of images of the same scene for example.

• mhnm this i a good idea i think. Maybe i can segment the image and meassure the standard deviation of the biggest segment. But segmentation need a lot of time – 501 - not implemented Sep 18 '12 at 15:35

Simply denoise an observed image and you'll get a second image for those algorithms requiring two images and they shall give you rough scores.

For sharpness, you can take a look at here and here.