Perform Flash/No-flash Denoising with Guided Filter

This example shows how to use a guided filter to smooth an image, reducing noise, while preserving edges. The example uses two pictures of the same scene, one taken with a flash and the other without a flash. The version without a flash preserves colors but is noisy due to the low-light conditions. This example uses the version taken with a flash as the guidance image.

Read the image that you want to filter. In this example, it's an image of some children's toys taken without a flash, A. Because of the low light conditions, the image contains a lot of noise.

A = imread('toysnoflash.png');
figure;
imshow(A);
title('Input Image - Camera Flash Off')

Next, read the image that you want to use as a guidance image. In this example, the guidance image is a picture of the same scene taken with a flash.

G = imread('toysflash.png');
figure;
imshow(G);
title('Guidance Image - Camera Flash On')

Perform the guided filtering operation. Using the imguidedfilter function, you can specify the size of the neighborhood used for filtering. The default is a 5-by-5 square. This example uses a 3-by-3 neighborhood. You can also specify the amount of smoothing performed by the filter. The value can be any positive number. One way to approach this is to use the default first and view the results. If you want less smoothing and more edge preservation, use a lower value for this parameter. For more smoothing, use a higher value. This example sets the value of the smoothing parameter.

nhoodSize = 3;
smoothValue  = 0.001*diff(getrangefromclass(G)).^2;
B = imguidedfilter(A, G, 'NeighborhoodSize',nhoodSize, 'DegreeOfSmoothing',smoothValue);

figure, imshow(B), title('Filtered Image')

Examine a close up of an area of the original image and compare it to the filtered image to see the effect of this edge-preserving smoothing filter.

figure; 
h1 = subplot(1,2,1); 
imshow(A), title('Region in Original Image'), axis on
h2 = subplot(1,2,2); 
imshow(B), title('Region in Filtered Image'), axis on
linkaxes([h1 h2])
xlim([520 660])
ylim([150 250])

Was this topic helpful?