Image Restoration Examples Colorado School of Mines Image and Multidimensional Signal Processing Image Restoration Metrics • RMS error is easy to compute (ie, square root of the mean squared error). – However, it (and similar metrics) are biased towards oversmoothed (i.e., blurry) results. Namely, an algorithm that removes not only the noise but also part of the structure (e.g., edges) will have a good score. • The structural similarity index (SSIM) takes into account the similarity of the edges (high frequency content) between the denoised image and the ideal one. – To have a good SSIM measure, an algorithm needs to remove the noise while also preserving the edges of the objects. Colorado School of Mines Image and Multidimensional Signal Processing 2 Other Image Restoration Metrics Colorado School of Mines Image and Multidimensional Signal Processing 3 Example 1 – Gaussian filter for denoising clear all close all % Get an image. Iinput = imread('liftingbody.png'); Iinput = double(Iinput); imshow(Iinput, []); % Input image % Add noise to the image. Let's use Gaussian noise, with sigma = sn. sn = 20.0; I = Iinput + sn*randn(size(Iinput)); figure, imshow(I, []); % Noisy image sigmaGaussian = 3.0; Iout = imfilter(I, fspecial('gaussian', 6*sigmaGaussian, sigmaGaussian)); figure, imshow(Iout, []), title('gaussian filter'); Idiff = Iout - Iinput; rms = sqrt(mean2(Idiff.^2)); figure, imshow(Idiff, []); title(sprintf('Errors (gaussian filter), rms = %f', rms)); Colorado School of Mines Image and Multidimensional Signal Processing 4 Example 2 - Bilateral Filter • The “bilateral filter” is similar to the “adaptive mean filter” discussed in the textbook. • It is useful to reduce image noise, but doesn’t blur across boundaries. • A good tutorial is available on this website: – http://people.csail.mit.edu/sparis/bf_course/ – Matlab code available there too. Colorado School of Mines Image and Multidimensional Signal Processing 5 Example 2 (continued) clear all close all % Get an image. Iinput = imread('liftingbody.png'); Iinput = double(Iinput); imshow(Iinput, []); % Input image % Add noise to the image. Let's use Gaussian noise, with sigma = sn. sn = 20.0; I = Iinput + sn*randn(size(Iinput)); figure, imshow(I, []); % Noisy image maxval = max(I(:)); minval = min(I(:)); sigmaSpatial = sigmaGaussian; sigmaRange = (maxval-minval)/10; % Default is (maxval-minval)/10 Iout = bilateralFilter(I, ... [], ... % optional edge image minval, maxval, ... % range of values sigmaSpatial, sigmaRange); % sigmaSpatial, sigmaRange figure, imshow(Iout, []), title('bilateral filter'); Idiff = Iout - Iinput; rms = sqrt(mean2(Idiff.^2)); figure, imshow(Idiff, []); Colorado School of Mines Image and Multidimensional Processing title(sprintf('Errors (bilateral filter),Signal rms = %f', rms)); 6 Example 3 - Blur Degradation • A blurring degradation can be modeled by a Gaussian h ( x, y ) = 1 2πσ 2 − e x2 + y2 2σ 2 • If you take an image of a dot (impulse), the output blurred image is just the Gaussian blurring function Colorado School of Mines Image and Multidimensional Signal Processing 7 Example 3 - Blurred image of a line • Assume that the input image is a bright vertical line located at x=a in the image, and zero everywhere else. • Namely, f(x,y) = δ(x-a). What is the degraded output image g(x,y)? Colorado School of Mines Image and Multidimensional Signal Processing 8 Example 3 (solution) • Solution: h ( x, y ) ∗ δ ( x − a ) = ∞ ∞ = ∫ ∫ h(x' , y') δ ((x − a ) − x') dx' dy' −∞ −∞ ∞ = ∫ h( x − a, y ' ) dy ' −∞ ∞ = ∫ e − (( x − a ) 2 + y '2 ) dy ' −∞ =e − ( x − a )2 ∞ − y' e ∫ dy' 2 −∞ 2 −𝑦𝑦 𝑒𝑒 over • The integral of all y is equal to the square root of pi. The output image g(x,y) is a vertical line that is blurred in the x direction. Namely, . 2 g ( x, y ) = π e − (( x − a ) ) Colorado School of Mines Image and Multidimensional Signal Processing 9 Example 4 – Compare filters • Compare the performance of these filters, on reducing added Gaussian noise: – – – – Gaussian low pass filter Bilateral filter Adaptive mean filter Anisotropic diffusion filter • Try on these images: – ckt-board.tif – Fig0222(a)(face).tif – cameraman.tif % Add noise to the image. Let's use Gaussian noise, with sigma = sn. sn = 20.0; I = Iinput + sn*randn(size(Iinput)); figure, imshow(I, []); % Noisy image Colorado School of Mines Image and Multidimensional Signal Processing 10 Example 4 (continued) • For each image and each filter, display the error image between the original (noise-free) image and the filtered reconstructed image. Notice where errors occur. • For each image and each filter, give the RMS error between the restored image and the original. See if a low RMS error gives the “best” reconstruction in terms of preserving edges as well as reducing noise. Colorado School of Mines Image and Multidimensional Signal Processing 11 Example 4 (continued) clear all close all % Get an image. %Iinput = imread('ckt-board.tif'); %Iinput = imread('Fig0222(a)(face).tif'); Iinput = imread('cameraman.tif'); Iinput = double(Iinput); imshow(Iinput, []); % Input image % Add noise to the image. Let's use Gaussian noise, with sigma = sn. sn = 20.0; I = Iinput + sn*randn(size(Iinput)); figure, imshow(I, []); % Noisy image sigmaGaussian = 3.0; Iout = imfilter(I, fspecial('gaussian', 6*sigmaGaussian, sigmaGaussian)); figure, imshow(Iout, []), title('gaussian filter'); Idiff = Iout - Iinput; rms = sqrt(mean2(Idiff.^2)) figure, imshow(Idiff, []); title(sprintf('Errors (gaussian filter), rms = %f', rms)); maxval = max(I(:)); minval = min(I(:)); sigmaSpatial = sigmaGaussian; sigmaRange = (maxval-minval)/10; Colorado School of Mines % Default is (maxval-minval)/10 Image and Multidimensional Signal Processing 12 Iout = bilateralFilter(I, ... [], ... % optional edge image minval, maxval, ... % range of values sigmaSpatial, sigmaRange); % sigmaSpatial, sigmaRange figure, imshow(Iout, []), title('bilateral filter'); Idiff = Iout - Iinput; rms = sqrt(mean2(Idiff.^2)) figure, imshow(Idiff, []); title(sprintf('Errors (bilateral filter), rms = %f', rms)); Iout = wiener2(I, [3*sigmaGaussian 3*sigmaGaussian]); figure, imshow(Iout, []), title('adaptive mean filter'); Idiff = Iout - Iinput; rms = sqrt(mean2(Idiff.^2)) figure, imshow(Idiff, []); title(sprintf('Errors (adaptive mean filter), rms = %f', rms)); % Parameters: niter - number of iterations. % kappa - conduction coefficient 20-100 ? % lambda - max value of .25 for stability % option - 1 Perona Malik diffusion equation No 1 % 2 Perona Malik diffusion equation No 2% Iout = anisodiff(I, ... 10, ... % niter - number of iterations 30, ... % conduction coefficient 20-100 0.25, ... % max value of .25 for stability 1); % option: Perona Malik diffusion equation No 1 or No 2 figure, imshow(Iout, []); Idiff = Iout - Iinput; rms = sqrt(mean2(Idiff.^2)) figure, imshow(Idiff, []); title(sprintf('Errors (anisotropic diffusion filter), rms = %f', rms)); Colorado School of Mines Image and Multidimensional Signal Processing 13 Example 4 (solutions) Image ckt-board.tif Fig0222(a)(face). tif cameraman.tif Colorado School of Mines Gaussian low pass 29.9 13.8 Bilateral Adaptive mean 10.4 9.4 15.9 8.7 Anisotropic diffusion 9.7 7.3 24.9 10.3 13.2 10.2 Image and Multidimensional Signal Processing 14